Используйте ConfigMap для заполнения mountPath в k8s deploy.yml - PullRequest
0 голосов
/ 25 января 2019

У меня есть док-контейнер, который отображает локальный каталог пользователя, чтобы он стал постоянным томом.Путь к каталогу настраивается с помощью переменной среды «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-variable.env):

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

Я создал ConfigMap с kubernetes, используя эту команду:

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

Вот файл deploy.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

ЧтоЯ хочу как-то заполнить значение mountPath, используя переменную окружения MYSQL_DATA_FOLDER, чтобы его можно было настраивать пользователем.

Я хочу иметь возможность "git pull" и работать без необходимости какой-либо последующей / предварительной обработкина файлы.

Спасибо за любые подсказки

1 Ответ

0 голосов
/ 25 января 2019

Вы можете сделать это, как показано ниже:

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}}
...
...