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

标签 kubernetes docker-volume amazon-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: example.com/main_api:private_key
          ports:
            - containerPort: 80

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

我如何告诉 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: 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:

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

一旦容器启动,它将写入共享卷。

所以我有两个问题:

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

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

最佳答案

如何在另一个容器开始使用 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

关于kubernetes - 如何使用kubernetes将数据从一个容器cp到另一个容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56860922/

相关文章:

Docker Compose 相对路径与 Docker 卷

docker - 在容器中写入文件时,Docker权限被拒绝

通过卷 docker 持久存储

spring-boot - 在AWS(EKS)上运行支持MySQL群集且启用HTTPS的Spring引导应用程序

python - Kubernetes 服务帐户没有分配角色?

google-kubernetes-engine - 主从 1.6.13-gke.0 升级到 1.7.11-gke.1 后的日志泛滥

kubernetes - 如何在EKS中添加或修复kube-dns?

amazon-elb - EKS + NLB : `service.beta.kubernetes.io/aws-load-balancer-internal: true` not working with `service.beta.kubernetes.io/aws-load-balancer-type: nlb`

Kubernetes:错误 kubectl edit 部署

kubernetes - CPU 资源单位 (millicore/millicpu) 是如何计算的?