【问题标题】:How to set environment variable in container from Kubernetes?如何从 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。

标签: kubernetes kubernetes-pod


【解决方案1】:

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

  1. (在 env vars 中读取):“source /env/required_envs.env”(将通过 secret mount in volume 来)
  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】:

    你为什么不移动

    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 命令。
    猜你喜欢
    • 2020-01-22
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2022-10-21
    • 2023-03-13
    • 2018-09-09
    相关资源
    最近更新 更多