【问题标题】:How to cp data from one container to another using kubernetes如何使用 kubernetes 将数据从一个容器 cp 到另一个容器
【发布时间】:2019-11-13 14:25:10
【问题描述】:

假设我们有一个简单的 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: example.com/main_api:private_key
          ports:
            - containerPort: 80

问题是这个镜像/容器依赖于另一个镜像/容器 - 它需要从另一个镜像中获取数据,或者使用一些共享卷。

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

看起来this article 解释了如何。

但不是 100% 清楚它是如何工作的。看起来您创建了一些共享卷,启动两个容器,使用该共享卷?

所以我根据该链接,将其添加到了我的 deployment.yml:

spec:

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

  containers:

    - name: ikg-api-demo
      imagePullPolicy: Always
      volumeMounts:
        - name: shared-data
          mountPath: /nltk_data
      image: example.com/nltk_data:latest

    - name: ikg-api-demo
      imagePullPolicy: Always
      volumeMounts:
        - name: shared-data
          mountPath: /nltk_data
      image: example.com/main_api:private_key
      ports:
        - containerPort: 80

我的主要犹豫是,将 /nltk_data 挂载为共享卷会覆盖可能已经存在的内容。

所以我假设我需要做的是将它安装在其他位置,然后为源数据容器创建入口点:

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

这样一旦容器启动,它就会将其写入共享卷。

所以我有两个问题:

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

  2. 如何写入共享卷而不让共享卷覆盖映像中的内容?换句话说,如果我在图像/容器中有 /xyz,我不想将/xyz 复制到/shared_volume_mount_location

【问题讨论】:

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


    【解决方案1】:

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

    使用 initContainers - 更新您的 deployment.yml,假设 example.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: example.com/nltk_data:latest
      containers:
        - name: ikg-api-demo
          imagePullPolicy: Always
          volumeMounts:
            - name: shared-data
              mountPath: /nltk_data
          image: example.com/main_api:private_key
          ports:
            - containerPort: 80
    

    【讨论】:

    • 酷,为什么一个 mountPath:mountPath: /mnt/nltk_data 而另一个是:mountPath: /nltk_data
    • 这取决于您的应用程序。将它安装在您想要的任何位置。如果应用程序查看/nltk_data,您就安装在那里。由于您要求不要打扰existing data,我建议使用/mnt/ 路径前缀。
    猜你喜欢
    • 2019-04-29
    • 2021-03-02
    • 2020-05-07
    • 1970-01-01
    • 2020-01-16
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    相关资源
    最近更新 更多