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

时间:2019-02-28 05:02:25

标签: kubernetes kubernetes-pod

在通过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"]

3 个答案:

答案 0 :(得分:0)

为什么不移动

RUN ./application-script.sh

下方

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

在env conf可用之前,该应用程序似乎正在运行。

答案 1 :(得分:0)

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

  1. (在env vars中读取):“ source /env/required_envs.env”(将通过secret批量安装)
  2. (主命令):“应用程序命令”

赞:


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 :(得分:0)

如果您可以使用busybox映像之类的东西对这个问题进行非常小的重现,它将有助于隔离变量。并非没有错误,但是我希望现在已经报告了这个错误:)