Is it possible to get container host path from environment variable?

8/13/2019

I am trying to set configurable host paths in kubernetes, but I am facing issues. I created a config map, which has the path and then I'm trying to replace the placeholder with the config map value. Here is my configuration:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php
  namespace: app
spec:
  template:
    spec:
      containers:
      - name: php
        env:
        - name: PHP_FOLDER
          valueFrom:
            configMapKeyRef:
              name: local-paths
              key: CODE_PATH
      volumes:
      - name: src-code
        hostPath:
          path: PHP_FOLDER
          type: Directory

I also tried

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php
  namespace: app
spec:
  template:
    spec:
      containers:
      - name: php
        env:
        - name: PHP_FOLDER
          valueFrom:
            configMapKeyRef:
              name: local-paths
              key: CODE_PATH
      volumes:
      - name: src-code
        hostPath:
          path: $(PHP_FOLDER)
          type: Directory 

I either get Error: Error response from daemon: create $(PHP_FOLDER): "$(PHP_FOLDER)" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path or MountVolume.SetUp failed for volume "src-code" : hostPath type check failed: PHP_FOLDER is not a directory

-- norbit
kubernetes
kustomize

3 Answers

8/13/2019

You cannot use a variable for path definition.

-- FL3SH
Source: StackOverflow

8/13/2019

As other users stated correctly, you can not use env variables in plain yaml/ kubectl. I suggest you add a lean layer before the deployment command and template the manifest with e.g. envsubst or ansible

-- dschuldt
Source: StackOverflow

8/13/2019

You just can't use environment values in yaml files directly. What you did actually a lot worse. ConfigMaps or secrets are created in runtime which means they won't be available until container starts running. However yaml parsing happens before pod or deployment even created. I think you should practice timeline more until you are using kubernetes in production or even testing.

In this case best practice would be to use bash script to change yaml file just before deploying and automatize it.

-- Akın Özer
Source: StackOverflow