首页 > 解决方案 > 无法在 kubernetes 数据库中添加 .sql 文件

问题描述

我正在使用“主机路径”将 .sql 文件访问到卷中。

当我们进入 mysql pod 时,我们可以看到 .sql 文件

(“laravel/laravel.sql”给定路径在卷挂载部分定义)

但它已成为目录而不是文件,我无法将 .sql 文件添加到数据库中。目前 .sql 文件的大小为 50Mi,因此无法使用 configmap。

请提供此问题的正确解决方案

mysql pod 镜像

mysql.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /home/paradise/lara_k8s/docker_qa-laravel
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1 
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: "MYSQL_ROOT_PASSWORD"
          value: "root"
        - name: "MYSQL_USERNAME"
          value: "root"
        - name: "MYSQL_PASSWORD"
          value: "root"
        - name: "MYSQL_DATABASE"
          value: "homestead"
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /laravel
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

标签: mysqldatabasedockerkubernetes

解决方案


正如您在Kubernetes 文档中所读到的:

hostPath 卷将文件或目录从主机节点的文件系统安装到您的 Pod 中。

并进一步:

除了必需的路径属性外,用户还可以选择指定 hostPath 卷的类型。

字段有一些受支持的值type。您应该在特定情况下使用的是 a File,其定义如下:

文件 文件必须存在于给定路径

在您的部署定义中,您应该使用文件的完整路径,如下例所示:

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test/file.sql
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      path: /data/file.sql
      type: File

要使用这种类型的卷,您不需要单独定义persistentVolumeand persistentVolumeClaim。如果您只需将其添加到您的部署定义中就足够了。如果出于某种原因您有兴趣创建一个hostPath PersistentVolume它很好地描述here

编辑:

部署定义的最后几行可能如下所示:

    volumeMounts:
    - name: mysql-volume
      mountPath: /laravel/your_file.sql
  volumes:
  - name: mysql-volume
    hostPath:
      path: /path/to/file/your_file.sql
      type: File

推荐阅读