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

Posted

技术标签:

【中文标题】如何从 Kubernetes 在容器中设置环境变量?【英文标题】:How to set environment variable in container from Kubernetes? 【发布时间】:2019-07-21 22:57:09 【问题描述】:

我想在通过 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 我添加了 Dockerfile。 【参考方案1】:

您也可以尝试在 Kubernetes POD 规范中运行两个命令:

    (在 env vars 中读取):“source /env/required_envs.env”(将通过 secret mount in volume 来) (主命令):“应用程序命令”

像这样:


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;

【讨论】:

【参考方案2】:

你为什么不移动

RUN ./application-script.sh

下面

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

看起来应用程序在 env conf 可用之前正在运行。

【讨论】:

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

以上是关于如何从 Kubernetes 在容器中设置环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 kubernetes pod 在 Stackdriver 中设置错误报告?

如何在 Visual Studio 2010 中设置环境变量?

如何在qt creator中设置环境变量

如何在 Debian/Ubuntu Docker 容器中设置语言环境?

如何在 Netbeans 中设置环境变量?

从 Node.js 中设置全局环境变量