如何从 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 中设置环境变量?