Как скопировать данные из одного контейнера в другой, используя kubernetes - PullRequest
2 голосов
/ 03 июля 2019

Скажем, у нас есть простой файл deploy.yml:

apiVersion: apps/v1 
kind: Deployment
metadata:
  namespace: ikg-api-demo
  name: ikg-api-demo
spec:
  selector:
    matchLabels:
      app: ikg-api-demo
  replicas: 3 
  template:
    metadata:
      labels:
        app: ikg-api-demo
    spec:
      containers:
        - name: ikg-api-demo
          imagePullPolicy: Always
          image: 913xxx371.dkr.ecr.us-west-2.amazonaws.com/main_api:c56cefbd0c81142558cf814cba7d7cd75d7cb6a7
          ports:
            - containerPort: 80

проблема в том, что это изображение / контейнер зависит от другого изображения / контейнера - ему нужно скопировать данные из другого изображения или использовать какой-то общий том.

Как я могу сказать kubernetes загрузить другое изображение, запустить его как контейнер, а затем скопировать данные из него в контейнер, объявленный в вышеуказанном файле?

Похоже, эта статья объясняет, как.

но не совсем понятно, как это работает. Похоже, вы создали какой-то общий том, запустили два контейнера, используя этот общий том?

поэтому я по этой ссылке добавил это в мой deploy.yml:

spec:

  volumes:
    - name: shared-data
      emptyDir: {}

  containers:

    - name: ikg-api-demo
      imagePullPolicy: Always
      volumeMounts:
        - name: shared-data
          mountPath: /nltk_data
      image: 913617820371.dkr.ecr.us-west-2.amazonaws.com/nltk_data:latest

    - name: ikg-api-demo
      imagePullPolicy: Always
      volumeMounts:
        - name: shared-data
          mountPath: /nltk_data
      image: 913xxx371.dkr.ecr.us-west-2.amazonaws.com/main_api:c56cefbd0c81142558cf814cba7d7cd75d7cb6a7
      ports:
        - containerPort: 80

Мое основное сомнение заключается в том, что монтирование / nltk_data в качестве общего тома перезапишет то, что уже может быть там.

Итак, я предполагаю, что мне нужно смонтировать его в другом месте, а затем сделать ENTRYPOINT для контейнера исходных данных:

ENTRYPOINT ['cp', '-r', '/nltk_data_source', '/nltk_data']

чтобы записать его на общий том после запуска контейнера.

Итак, у меня два вопроса:

  1. Как запустить один контейнер и завершить работу, прежде чем другой контейнер начнет использовать kubernetes?

  2. Как записать на общий том без перезаписи того общего тома, что есть на вашем изображении? Другими словами, если у меня есть / xyz в изображении / контейнере, я не хочу копировать /xyz в /shared_volume_mount_location, если мне не нужно.

1 Ответ

8 голосов
/ 03 июля 2019

Как запустить один контейнер и завершить работу, прежде чем другой контейнер начнет использовать kubernetes?

Использовать initContainers - обновил ваш deploy.yml, предполагая, что 913617820371.dkr.ecr.us-west-2.amazonaws.com/nltk_data:latest - это ваш образ данных

Как записать на общий том без перезаписи этого общего тома?

Поскольку вы знаете, что там в вашем образе, вам нужно выбрать подходящий путь монтирования. Я бы использовал /mnt/nltk_data

Обновлен файл deploy.yml с контейнерами init

spec:
  volumes:
    - name: shared-data
      emptyDir: {}
  initContainers:
    - name: init-ikg-api-demo
      imagePullPolicy: Always
      # You can use command, if you don't want to change the ENTRYPOINT
      command: ['sh', '-c', 'cp -r /nltk_data_source /mnt/nltk_data']
      volumeMounts:
        - name: shared-data
          mountPath: /mnt/nltk_data
      image: 913617820371.dkr.ecr.us-west-2.amazonaws.com/nltk_data:latest
  containers:
    - name: ikg-api-demo
      imagePullPolicy: Always
      volumeMounts:
        - name: shared-data
          mountPath: /nltk_data
      image: 913xxx371.dkr.ecr.us-west-2.amazonaws.com/main_api:c56cefbd0c81142558cf814cba7d7cd75d7cb6a7
      ports:
        - containerPort: 80
...