Override env values defined in container spec

12,277

From Kubernetes API reference:

envFrom : List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.

So above clearly states the env will take precedence than envFrom.

When a key exists in multiple sources, the value associated with the last source will take precedence.

So, for overriding, don't use envFrom, but define the value twice within env, see below:

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

Check:

kubectl logs busy -n default
CONFIGMAP_VALUE
Share:
12,277

Related videos on Youtube

asenovm
Author by

asenovm

Computer Science student from Sofia, Bulgaria

Updated on July 09, 2021

Comments

  • asenovm
    asenovm almost 3 years

    I have a configmap where I have defined the following key-value mapping in the data section:

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

    then in the definition of my container (in the deployment / statefulset manifest) I have the following:

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

    When doing this I was expecting that the value from the configmap (TEST="CONFIGMAP_VALUE") will override the (default) value specified in the container spec (TEST="ANOTHER_VALUE"), but this is not the case (TEST always gets the value from the container spec). I couldn't find any relevant documentation about this - is it possible to achieve such env variable value overriding?

  • focus zheng
    focus zheng about 3 years
    what if I have a entrypoint.sh in Docker image which also have a same environment variable which is generated by export TEST=123456?
  • Kristoffer Bakkejord
    Kristoffer Bakkejord about 3 years
    @focuszheng Then that will take precedence, since it's the last thing to run.