【问题标题】:Unable to access volume content using initContainers无法使用 initContainers 访问卷内容
【发布时间】:2020-09-21 23:38:20
【问题描述】:

我有一张简单的图片 (mdw:1.0.0),里面有一些内容:

FROM alpine:3.9
COPY /role /mdw
WORKDIR /mdw

我希望我的容器 'nginx' 会看到 /mdw 文件夹的内容,但没有文件。

apiVersion: v1
kind: Pod
metadata:
 name: init-demo
spec:
 initContainers:
 - name: install
   image: mdw:1.0.0
   imagePullPolicy: Never
   volumeMounts:
   - name: workdir
     mountPath: "/mdw"
 containers:
 - name: nginx
   image: nginx
   volumeMounts:
   - name: workdir
     mountPath: /mdw
   command: ["ls", "-l", "/mdw"]
 volumes:
 - name: workdir
   emptyDir: {}

你知道是什么原因以及如何解决吗?

非常感谢

【问题讨论】:

  • 我最近发现了一个类似的问题。请查看我的answer
  • 你怎么知道它没有?

标签: kubernetes docker-volume


【解决方案1】:

您的 init 容器没有做任何事情:Dockerfile 没有 CMD 并且 Kubernetes 部署规范也没有设置 command:。它启动并立即退出。 (基本的 Linux 发行版映像通常有一个默认命令来启动交互式 shell,但如果没有 tty,这也会立即退出。)

同时,您的 Kubernetes 设置还会在您放入映像的唯一内容上挂载一个空目录,这会阻止 init 容器发挥作用。

您可以构建一个自定义的nginx 图像,直接复制其中的内容:

FROM nginx
COPY /role /usr/share/nginx/html

不要使用initContainers:,而是将该图像用作主要的containers: 图像。

有一个特定于 Docker 的功能,使用 Docker 命名卷,可以在首次使用时填充命名卷,您可能正在考虑这个功能。这带有几个重要的警告(它仅在您第一次运行容器时生效,并忽略对映像的更新;它不适用于绑定挂载)。这是一个纯 Docker 特有的功能:Kubernetes 永远不会为您自动填充卷。

【讨论】:

  • 感谢大卫的回复。但是,我使用 initContainers 是因为我想将配置模板 (mdw) 和主应用程序分开。目标是: 1 个仅包含模板的容器。 1 个容器来运行模板引擎并为主容器生成最终配置。您提议的是将配置直接嵌入到我想避免的主应用程序中。你明白我的意思吗?
  • 这是像 nginx 配置还是实际的 HTML 内容?我会在构建时执行诸如渲染模板之类的事情,而不是部署时(因此更多地涉及 Dockerfile 中的RUN 命令);或者使用 Kubernetes ConfigMap 来注入配置文件之类的东西。
  • 我想为所有环境使用相同的图像。我认为在运行时生成配置是一个好习惯。为每个环境构建图像似乎是一种反模式
【解决方案2】:

如果目录已存在,则安装卷时将被擦除。这是故意的,真的没有办法解决。

唯一的方法是在安装完成后填充目录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多