如何在Kubernetes容器中设置环境变量?

7

我希望在通过Kubernetes部署容器时,设置一个环境变量(我将其命名为ENV_VAR_VALUE)。

在Pod的yaml配置中,我有以下内容:

...
...
    spec:
      containers:
      - name: appname-service
        image: path/to/registry/image-name
        ports:
        - containerPort: 1234
        env:
        - name: "ENV_VAR_VALUE"
          value: "some.important.value"
...
...

容器需要使用ENV_VAR_VALUE的值。
但在容器的应用程序日志中,它的值总是为空。
因此,我尝试从容器内部检查它的值:
$ kubectl exec -it appname-service bash
root@appname-service:/# echo $ENV_VAR_VALUE
some.important.value
root@appname-service:/# 

因此,该值已成功设置。

我想这是因为 Kubernetes 定义的环境变量在容器初始化后才设置。

因此,我尝试从 Pod YAML 配置中覆盖容器的 CMD:

...
...
    spec:
      containers:
      - name: appname-service
        image: path/to/registry/image-name
        ports:
        - containerPort: 1234
        env:
        - name: "ENV_VAR_VALUE"
          value: "some.important.value"
        command: ["/bin/bash"]
        args: ["-c", "application-command"]
...
...

即使如此,在命令执行期间,ENV_VAR_VALUE 的值仍然为空。
幸运的是,该应用程序具有重新启动功能,因为当我重新启动应用程序时,ENV_VAR_VALUE 能够成功使用。
在此期间,至少我可以进行其他一些测试。

那么问题是...

我应该如何在 Kubernetes 中配置它,以便在设置环境变量时并不过于晚?

根据要求,这是 Dockerfile。
很抱歉这么抽象...

FROM ubuntu:18.04

RUN apt-get update && apt-get install -y some-dependencies

COPY application-script.sh application-script.sh

RUN ./application-script.sh

# ENV_VAR_VALUE is set in this file which is populated when application-command is executed
COPY app-config.conf /etc/app/app-config.conf

CMD ["/bin/bash", "-c", "application-command"]

你可能需要分享容器的Dockerfile。 - manojlds
我添加了Dockerfile。 - libzz
2个回答

1
您可以尝试在Kubernetes POD规范中运行两个命令:
  1. (读取环境变量): "source /env/required_envs.env" (通过secret挂载到卷中)
  2. (主命令): "application-command"
像这样:
containers:
  - name: appname-service
    image: path/to/registry/image-name
    ports:
        - containerPort: 1234
    command: ["/bin/sh", "-c"]
    args:
      - source /env/db_cred.env;
        application-command;

0

为什么不移动这个

RUN ./application-script.sh

以下

COPY app-config.conf /etc/app/app-config.conf

看起来应用程序在环境配置可用之前就已经运行了。


因为application-script.sh执行完成后,/etc/app目录才可用。是的,这正是我的问题。application-command在Kubernetes填充ENV_VAR_VALUE之前就被执行了。 - libzz
然后就是执行 RUN mkdir /etc/app 命令或者适当地拆分脚本。 - manojlds
但这并不会改变任何事情。问题在于 ENV_VAR_VALUE 是由 CMD 命令填充的。Kubernetes 需要运行容器才能设置环境变量。当容器首次初始化时,环境变量设置已经太晚了。我猜这是个死胡同? - libzz
环境变量不仅适用于CMD。您可以尝试运行RUN echo $ENV_VAR_VALUE来查看。您甚至可以在dockerfile中尝试使用ENV命令。 - manojlds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接