【问题标题】:Share data from one Kubernetes container to another inside same pod将数据从一个 Kubernetes 容器共享到同一 pod 内的另一个容器
【发布时间】:2019-04-29 19:42:54
【问题描述】:

我的 Pod 中有两个容器:

  • 基于我自己的 Dockerfile 的容器 A。在这个 Dockerfile 里面,有COPY ./files /my-files 命令。此图像位于我的 GitLab Docker 注册表中。
  • 容器 B 基于来自 hub.docker.com 的图像。

我想将存储在 /my-files 中的容器 A 中的数据共享到容器 B。我认为我需要在这个 pod 和 volumeMounts 内创建一个 volume(它不是持久数据)到容器。

不幸的是,当我使用 mountPath: /my-files 将 volumeMounts 添加到容器 A 时,此目录已清空,并且在创建映像时没有添加任何文件。

我应该怎么做才能保留这些数据并与容器 B 共享。

这是我的 Deployment.yaml 文件的一部分:

containers:
- name: Container-A
  image: "my-gitlab-registry/my-image-a-with-copied-files"
  volumeMounts:
    - name: shared-data
      mountPath: /my-files
- name: Container-B
  image: "some-public-image"
  volumeMounts:
  - name: shared-data
    mountPath: /files-from-container-a

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

【问题讨论】:

  • 当您在 k8s 容器中挂载时,挂载的卷将“隐藏”该位置已存在的任何内容。这是什么数据?听起来您需要为它创建一个 configmap,或者您需要在创建 pod 和容器之前将其复制到两个映像中。
  • 我正在使用 PHP-FPM 和 Apache 创建一个 PHP 应用程序。第一个容器基于 PHP-FPM。我将应用程序的所有数据复制到 /var/www/html 中。第二个是Apache指向FPM。但是两个容器都需要 /var/www/html 目录中的相同文件。可悲的是,没有“标志”告诉保留这些文件并在已安装的卷中复制。
  • 您只是想让 Apache 充当 PHP-FPM 的反向代理吗?如果是这样,要做的事情是使用端口映射让 Apache 与您的 PHP 容器对话,而不是直接共享任何内容。您的 Apache 容器会从 configmap 获取它的配置,然后在某个任意端口(例如 8080)上直接向您的应用容器发出请求。
  • 如果您真的需要在两个容器之间共享静态内容,您需要将该内容构建到两个图像中(在这种情况下,它们可能会在后台共享层),或者将该内容存储在一些其他系统,例如 S3 存储桶,然后通过卷挂载将其映射到您的容器中。

标签: kubernetes


【解决方案1】:

一个丑陋的 hack,使用 init 容器,将数据复制到 emptyDir 卷中,然后将卷挂载到第二个容器中。

  initContainers:
    - name: init-config-data-copy-wait
      image: datacontainer
      command:
        - sh
        - "-ce"
        - |
          set -ex
          cp -r /src-data/* /dst-data/
          ls /dst-data/
      volumeMounts:
        - mountPath: /dst-data
          name: dst-data-volume

  volumes:
    - name: dst-data-volume
      emptyDir: {}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    相关资源
    最近更新 更多