如何使用kubernetes将数据从一个容器CP到另一个容器

时间:2019-07-02 22:51:35

标签: kubernetes docker-volume amazon-eks eks docker-copy

假设我们有一个简单的deployment.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

问题在于此映像/容器依赖于另一个映像/容器-它需要从另一个映像中cp数据,或使用某些共享卷。

我如何告诉kubernetes下载另一个图像,将其作为容器运行,然后将数据从其中复制到上述文件中声明的容器中?

好像this article解释了如何。

,但尚不清楚100%如何工作。好像您创建了一些共享卷,使用该共享卷启动了两个容器?<​​/ p>

所以我根据那个链接,将其添加到我的Deployment.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 个答案:

答案 0 :(得分:8)

如何在另一个容器开始使用kubernetes之前运行一个容器并完成一项工作?

使用initContainers-更新了您的deployment.yml,假设913617820371.dkr.ecr.us-west-2.amazonaws.com/nltk_data:latest是您的数据映像

如何在不覆盖共享卷的情况下写入共享卷?

由于您知道映像中包含的内容,因此需要选择适当的安装路径。我会使用/mnt/nltk_data

使用初始化容器更新了Deployment.yml

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