如何在Kubernetes中向卷挂载的ConfigMap脚本传递环境变量
动态传递环境变量
VAR到ConfigMap的解决方案 下面提供几种可行的实现方式,根据你的场景需求选择即可:
方法1:容器启动时直接替换变量
直接在Workflow的容器命令中加入sed替换逻辑,读取传入的参数替换ConfigMap文件中的$VAR:
apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: name: test-wf- spec: entrypoint: main # 定义可外部传入的参数 arguments: parameters: - name: var-value value: "hello-argo" # 默认值,可动态传入 templates: - name: main inputs: parameters: - name: var-value container: image: "ubuntu" command: ["/bin/sh", "-c"] args: - | # 替换文件中的$VAR为传入的参数值 sed -i "s/\$VAR/{{inputs.parameters.var-value}}/" /mnt/vc/test # 验证替换结果 cat /mnt/vc/test volumeMounts: - name: vc mountPath: "/mnt/vc" volumes: - name: vc configMap: name: test-pod-cfg items: - key: test-pod.yaml path: test
这种方式简单直接,适合临时替换、不需要保留替换后ConfigMap的场景。
方法2:用Init容器提前完成替换
如果需要在主容器启动前就完成变量替换,可借助Init容器处理原始ConfigMap文件,再将处理后的文件挂载给主容器:
apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: name: test-wf- spec: entrypoint: main arguments: parameters: - name: var-value value: "init-demo" templates: - name: main inputs: parameters: - name: var-value volumes: - name: processed-cfg emptyDir: {} # 存储替换后的文件 - name: original-cfg configMap: name: test-pod-cfg items: - key: test-pod.yaml path: test # 先执行Init容器完成变量替换 initContainers: - name: replace-var image: "ubuntu" command: ["/bin/sh", "-c"] args: - | sed "s/\$VAR/{{inputs.parameters.var-value}}/" /mnt/original/test > /mnt/processed/test volumeMounts: - name: original-cfg mountPath: "/mnt/original" - name: processed-cfg mountPath: "/mnt/processed" container: image: "ubuntu" command: ["/bin/sh", "-c", "cat /mnt/vc/test"] volumeMounts: - name: processed-cfg mountPath: "/mnt/vc"
Init容器会先处理ConfigMap内容,主容器挂载的是已经完成替换的文件,适合主容器逻辑无需关心替换步骤的场景。
方法3:动态生成替换后的ConfigMap
如果需要生成持久化的、已替换变量的ConfigMap,可以通过脚本动态创建新的ConfigMap,再挂载给主容器:
apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: name: test-wf-dynamic-cfg spec: entrypoint: main arguments: parameters: - name: var-value value: "dynamic-cfg-demo" templates: - name: main inputs: parameters: - name: var-value steps: - - name: generate-cfgmap template: create-dynamic-cfg - - name: use-cfgmap template: mount-dynamic-cfg arguments: parameters: - name: cfg-name value: "{{steps.generate-cfgmap.outputs.parameters.cfg-name}}" # 动态生成带替换后内容的ConfigMap - name: create-dynamic-cfg script: image: "bitnami/kubectl:latest" command: [sh] source: | # 生成替换VAR后的Pod配置 cat <<EOF > test-pod.yaml apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: test image: ubuntu command: ["/busybox/sh", "-c", "echo {{inputs.parameters.var-value}}"] EOF # 创建新的ConfigMap kubectl create configmap dynamic-test-cfg --from-file=test-pod.yaml # 输出ConfigMap名称供后续步骤使用 echo -n "dynamic-test-cfg" outputs: parameters: - name: cfg-name valueFrom: path: /tmp/script-output # 挂载动态生成的ConfigMap - name: mount-dynamic-cfg inputs: parameters: - name: cfg-name container: image: "ubuntu" command: ["/bin/sh", "-c", "cat /mnt/vc/test"] volumeMounts: - name: vc mountPath: "/mnt/vc" volumes: - name: vc configMap: name: "{{inputs.parameters.cfg-name}}" items: - key: test-pod.yaml path: test
这种方式适合需要复用替换后配置的场景,生成的ConfigMap可被其他资源引用。
内容的提问来源于stack exchange,提问作者Karamchand
相关产品推荐
相关产品推荐

