覆盖容器规范中定义的环境变量值

40

我有一个配置映射(configmap),在其中我定义了以下键值映射,位于data部分:

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

那么在我的容器定义中(在部署/有状态集清单中),我有以下内容:

        env:
        - name: TEST
          value: "ANOTHER_VALUE"
        envFrom:
        - configMapRef:
            name: test-config
当我这样做时,我期望来自configmap的值(TEST="CONFIGMAP_VALUE")将覆盖容器规范中指定的(默认)值(TEST="ANOTHER_VALUE"), 但事实并非如此(TEST总是获得来自容器规范的值)。我找不到任何相关文档 - 是否可能实现此类环境变量值覆盖?
1个回答

62
Kubernetes API参考中可以看到:

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生成的,那该怎么办? - focus zheng
1
@focuszheng 那么它将具有优先权,因为它是最后执行的内容。 - Kristoffer Bakkejord
上面的链接已经失效了。不确定这个答案是否仍然准确/有效。在我的情况下,两个环境变量都被添加了,而且它们的值也不同! - babis21
上面的链接已经失效了。不确定这个答案是否仍然准确/有效。在我的情况下,两个环境变量都被添加了,而且它们的值也不同! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接