Kubernetes: How to expand env variables from configmap

8/25/2018

I'm using config maps to inject env variables into my containers. Some of the variables are created by concatenating variables, for example:

~/.env file

HELLO=hello
WORLD=world
HELLO_WORLD=${HELLO}_${WORLD}

I then create the config map

kubectl create configmap env-variables --from-env-file ~/.env

The deployment manifests reference the config map.

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: my-app
spec:
  template:
    spec:
      containers:
      - name: my-image
        image: us.gcr.io/my-image
        envFrom:
        - configMapRef:
            name: env-variables

When I exec into my running pods, and execute the command

$ printenv HELLO_WORLD

I expect to see hello_world, but instead I see ${HELLO}_${WORLD}. The variables aren't expanded, and therefore my applications that refer to these variables will get the unexpanded value.

How do I ensure the variables get expanded?

If it matters, my images are using alpine.

-- Eric Guan
docker
kubernetes

2 Answers

8/25/2018

I can't find any documentation on interpolating environment variables, but I was able to get this to work by removing the interpolated variable from the configmap and listing it directly in the deployment. It also works if all variables are listed directly in the deployment. It looks like kubernetes doesn't apply interpolation to variables loaded from configmaps.

For instance, this will work:

Configmap

apiVersion: v1
data:
  HELLO: hello
  WORLD: world
kind: ConfigMap
metadata:
  name: env-variables
  namespace: default

Deployment:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: my-app
spec:
  template:
    spec:
      containers:
      - name: my-image
        image: us.gcr.io/my-image
        envFrom:
        - configMapRef:
            name: env-variables
        env:
        - name: HELLO_WORLD
          value: $(HELLO)_$(WORLD)
-- Grant David Bachman
Source: StackOverflow

8/25/2018

I'm thinking about just expanding the variables before creating the configMap and uploading to kubernetes

Another parallel approach would be to use kustomize:

kustomize lets you customize raw, template-free YAML files for multiple purposes, leaving the original YAML untouched and usable as is.

It's like make, in that what it does is declared in a file, and it's like sed, in that it emits edited text.

The sed part should be able to generate the right expanded value in your yaml file.

-- VonC
Source: StackOverflow