Env var 在 scipt/command 中不可用(Kubernetes)

Env var not available in scipt/command in a kind Job (Kubernetes)

我运行这份工作:

kubectl apply -f - <<EOF
apiVersion: batch/v1
kind: Job
metadata:
  name: sample
spec:
  template:
    spec:
      containers:
      - command:
        - /bin/bash
        - -c
        - |
          env
          echo "MY_VAR : ${MY_VAR}"
          sleep 800000
        env:
        - name: MY_VAR
          value: MY_VALUE
        image: mcr.microsoft.com/azure-cli:2.0.80
        imagePullPolicy: IfNotPresent
        name: sample
      restartPolicy: Never
  backoffLimit: 4
EOF

但是当我查看日志时,值 MY_VALUE 是空的,即使 env 打印它:

$ kubectl logs -f sample-7p6bp
...
MY_VAR=MY_VALUE
...
MY_VAR : 

为什么此行包含 ${MY_VAR} 的空值:

echo "MY_VAR : ${MY_VAR}"

?

更新: 用一个简单的 pod 进行同样的尝试:

kubectl -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: sample
spec:
  containers:
  - name: sample
    imagePullPolicy: Always
    command: ["/bin/sh", "-c", "echo BEGIN ${MY_VAR} END"]
    image: radial/busyboxplus:curl
    env:
    - name: MY_VAR
      value: MY_VALUE
EOF

Same/empty 结果:

$ kubectl logs -f sample
BEGIN END

发生这种情况的原因是因为您的 shell 在将变量 ${MY_VAR} 发送到 kubernetes 之前对其进行了扩展。您可以通过引用终止符来禁用 heredoc 内部的参数扩展:

kubectl apply -f - <<'EOF'

添加这些引号应该可以解决您的问题。