首页 文章

Kubernetes Daemonset HELM图表 - 使用命令参数使用cURL设置环境变量

提问于
浏览
-1

我正在尝试使用Helm Charts在Kubernetes Daemonset中传递一个命令参数,该参数执行从cURL结果传入的新环境变量的导出 .

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}')"]

结果应该是在容器中设置变量,例如计算机类型=计算

我也尝试过使用命令args:

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}'`)"]

当我尝试部署守护进程时,收到错误消息 "Error: YAML parse error on /templates/daemonset.yaml: error converting YAML to JSON: yaml: line 46: found unknown escape character"

如果我从容器中运行导出命令,则该命令有效 .

我的目标是能够从daemonset.yaml设置最终容器环境变量(LABEL),它是两个环境变量的连接,例如:

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}'`)"]

因此LABEL变量的容器中的'env'输出将是

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

我知道 value: $MACHINE_TYPE-$HOSTNAME 的值不起作用,所以也希望得到帮助 .

1 回答

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

    错误消息似乎非常简单:backslash is magic in a double-quoted string

    如果您使用更简单的yaml结构,而不使用双引号字符串,则可以根据需要使用单个反斜杠:

    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}')
    

    并从无限更清晰的语法中受益


    分别,

    daemonset.yaml中的最终容器环境变量(LABEL)

    在这种情况下,您希望 env: 块中的 valueFrom: fieldPath: status.nodeName 设置 HOSTNAME ,然后(正如您当前所做的那样)在执行实际的容器内命令之前立即从其 MACHINE_TYPE 组件构建 LABEL . 你不能(我知道)在kubernetes描述符的 env 块中声明 LABEL 因为你正在混合试图在影响该命令的kubernetes描述符的容器中运行命令的隐喻 .

    我知道 Value :$ MACHINE_TYPE- $ HOSTNAME不起作用,所以也希望得到帮助 . 提前致谢 .

    关于这一点有很多现有的SO答案,但语法是 $(MACHINE_TYPE)-$(HOSTNAME) assuming 这两个env-vars在Pod的 env: 块中声明,否则

相关问题