【问题标题】:Override env values defined in container spec覆盖容器规范中定义的环境值
【发布时间】:2019-06-21 05:39:55
【问题描述】:

我有一个 configmap,我在 data 部分定义了以下键值映射:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: test
  name: test-config
data:
  TEST: "CONFIGMAP_VALUE"

然后在我的容器的定义中(在部署/statefulset 清单中)我有以下内容:

        env:
        - name: TEST
          value: "ANOTHER_VALUE"
        envFrom:
        - configMapRef:
            name: test-config

执行此操作时,我期望配置映射 (TEST="CONFIGMAP_VALUE") 中的值将覆盖容器规范 (TEST="ANOTHER_VALUE") 中指定的(默认)值,但事实并非如此(TEST总是从容器规范中获取值)。我找不到任何相关文档 - 是否有可能实现这样的环境变量值覆盖?

【问题讨论】:

    标签: deployment kubernetes environment-variables containers configmap


    【解决方案1】:

    来自Kubernetes API reference

    envFrom :在容器中填充环境变量的源列表。在源中定义的键必须是 C_IDENTIFIER。容器启动时,所有无效键都将作为事件报告。当一个键存在于多个源中时,与最后一个源关联的值将优先。由具有重复键的 Env 定义的值将优先。无法更新。

    所以上面明确指出 env 将优先于 envFrom

    当一个键存在于多个来源中时,与最后一个来源关联的值将优先。

    因此,对于覆盖,不要使用envFrom,而是在env 中定义两次值,见下文:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      namespace: default
      name: test-config
    data:
      TEST: "CONFIGMAP_VALUE"
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: busy
      namespace: default
    spec:
      containers:
      - name: busybox
        image: busybox
        env:
        - name: TEST
          value: "DEFAULT_VAULT"
        - name: TEST
          valueFrom:
            configMapKeyRef:
              name: test-config
              key: TEST
        command:
        - "sh"
        - "-c"
        - >
          while true; do
            echo "$(TEST)";
            sleep 3600;
          done
    

    检查:

    kubectl logs busy -n default
    CONFIGMAP_VALUE
    

    【讨论】:

    • 如果我在 Docker 镜像中有一个 entrypoint.sh,它也有一个由 export TEST=123456 生成的相同环境变量怎么办?
    • @focuszheng 那将优先,因为它是最后运行的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 2019-05-21
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2015-10-11
    相关资源
    最近更新 更多