【问题标题】:Use ConfigMap to populate mountPath in k8s deployment.yml使用 ConfigMap 填充 k8s deployment.yml 中的 mountPath
【发布时间】:2019-06-18 20:11:18
【问题描述】:

我有一个 docker 容器,它映射用户的本地目录,使其成为一个持久卷。目录路径可通过环境变量“MYSQL_DATA_FOLDER”进行自定义。

这在本地运行 docker 容器时可以正常工作,但是,当通过 minikube/kubernetes 启动容器时,这种方法不再有效

当只使用 docker 启动这个容器时,我会使用这个命令:

docker-compose run --service-ports --volume=$MYSQL_DATA_FOLDER:/var/lib/mysql --name db --rm database

这是 docker-compose.yml 文件

version: '3.5'
services:
  database:
    image: mysql:5.7
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ""
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
    volumes:
      - mydatavolume:${MYSQL_DATA_FOLDER}
    build:
      context: .
      dockerfile: Dockerfile

volumes:
  mydatavolume:

networks:
  default:
    name: dev_network
    driver: bridge

这里是环境变量文件(env-variables.env):

MYSQL_ALLOW_EMPTY_PASSWORD=yes
MYSQL_ROOT_PASSWORD=
MYSQL_DATA_FOLDER=/Users/foo/mysql/data

我使用这个命令用 kubernetes 创建了一个 ConfigMap:

kubectl create configmap db-env --from-env-file=env-variables.env 

这里是deployment.yml文件:

apiVersion: v1
kind: Service
metadata:
  name: db-mysql
  labels:
    app: db
spec:
  ports:
    - port: 3306
  selector:
    app: db
    tier: mysql
  clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: db
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1 
kind: Deployment
metadata:
  name: db-mysql
  labels:
    app: db
spec:
  selector:
    matchLabels:
      app: db
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: db
        tier: mysql
    spec:
      containers:
      - image: mysql
        name: mysql
        envFrom:
          - configMapRef:
              name: db-env
        livenessProbe:
          tcpSocket:
            port: 3306
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: ${MYSQL_DATA_FOLDER}
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

我想做的是以某种方式使用环境变量 MYSQL_DATA_FOLDER 填充 mountPath 值,以便用户可以配置它。

我希望能够“git pull”并且无需对文件进行任何后期/预处理。

感谢任何线索

【问题讨论】:

    标签: docker configuration kubernetes environment-variables


    【解决方案1】:

    你可以这样做:

    source env.file && cat deployment.yml  | sed "s/{{MYSQL_DATA_FOLDER}}/$MYSQL_DATA_FOLDER/g" | kubectl apply -f -
    

    还有你的 yaml 文件变量,比如:

    ...
            volumeMounts:
            - name: mysql-persistent-storage
              mountPath: {{MYSQL_DATA_FOLDER}}
    ...
    

    【讨论】:

    • 我知道,但我希望有一个不需要像这样预处理的解决方案
    • 你需要某种模板层,无论是 this、envsubst、Helm、Kustomize 等。
    猜你喜欢
    • 2020-10-21
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    相关资源
    最近更新 更多