Kubernetes Daemonset HELM charts - using command argument to set environment variable using cURL

4/20/2018

I'm trying to pass in a command argument in Kubernetes Daemonset with Helm Charts which performs export of an new environment variable passed in from a cURL result.

command: ["/bin/bash","-c","export MACHINE_TYPE=$(curl --unix-socket /var/run/docker.sock http://docker/containers/rancher-agent/json | grep -oP 'CATTLE_HOST_LABELS=.+?\w+' | awk -F '=' '{print $2}')"]

The result should be that the variable is set in the container e.g. MACHINE_TYPE=compute

I have also tried using command + args like so:

command: ["/bin/bash","-c"]
args: ["export MACHINE_TYPE=$(`curl --unix-socket /var/run/docker.sock http://docker/containers/rancher-agent/json | grep -oP 'CATTLE_HOST_LABELS=.+?\w+' | awk -F = '{print $2}'`)"]

When I try to deploy the daemonset, I get an error message "Error: YAML parse error on /templates/daemonset.yaml: error converting YAML to JSON: yaml: line 46: found unknown escape character"

The export command works if I run it from within the container.

My aim is to be able to set a final container environment variable (LABEL) from the daemonset.yaml which is concatenate of two environment variables e.g.

containers:
  - name: {{ .Chart.Name }}
    image: "{{.Values.image.repository}}:{{.Values.image.tag}}"
    imagePullPolicy: {{.Values.image.pullPolicy}}
    env:
      - name: LABEL
        value: $MACHINE_TYPE-$HOSTNAME
    command: ["/bin/bash","-c"]
    args: ["export MACHINE_TYPE=$(`curl --unix-socket /var/run/docker.sock http://docker/containers/rancher-agent/json | grep -oP 'CATTLE_HOST_LABELS=.+?\w+' | awk -F = '{print $2}'`)"]

so the 'env' output in the container for LABEL variable would be

LABEL=compute-ip-x-x-x-x.ap-southeast-2.compute.internal

I know that the value value: $MACHINE_TYPE-$HOSTNAME will not work, so hoping for assistance with that as well.

-- danallraj
kubernetes
kubernetes-helm

1 Answer

4/21/2018
found unknown escape character 'w'
     ... rep -oP 'CATTLE_HOST_LABELS=.+?\w+' | awk -F '=' '{print $2}')"]
                                         ^)

The error message appears to be pretty straightforward: backslash is magic in a double-quoted string

If you use the more straightforward yaml structure, without using the double-quoted strings, you can use the single backslash as you wish:

command:
- /bin/bash
- -c
- export MACHINE_TYPE=$(curl --unix-socket /var/run/docker.sock http://docker/containers/rancher-agent/json | grep -oP 'CATTLE_HOST_LABELS=.+?\w+' | awk -F '=' '{print $2}')

and benefiting from the infinitely more legible syntax


Separately,

final container environment variable (LABEL) from the daemonset.yaml

In that case, you want the valueFrom: fieldPath: status.nodeName in your env: block to set HOSTNAME, and then (as you are currently doing) build up the LABEL from its MACHINE_TYPE component right before executing the actual in-container command. You cannot (that I am aware of) declare LABEL in the kubernetes descriptor's env block because you are mixing metaphors trying to run a command in a container that affects the kubernetes descriptor for that command.

I know that the value value: $MACHINE_TYPE-$HOSTNAME will not work, so hoping for assistance with that as well. Thanks in advance.

There are plenty of existing SO answers about that, but the syntax is $(MACHINE_TYPE)-$(HOSTNAME) assuming those two env-vars are declared in the Pod's env: block, and not otherwise

-- mdaniel
Source: StackOverflow