如何在Argo Workflow中调用带可选参数的容器命令?
解决Argo Workflow中可选命令参数的调用问题
你的原配置问题在于:当long-format为false时,args数组会包含一个空字符串参数,实际执行的是ls "" /etc,这会导致ls尝试列出名为空字符串的文件,不符合预期。下面提供几种可行的解决方案:
方法1:动态生成args数组(推荐)
利用Argo的模板条件语法直接生成对应参数数组,避免空参数:
apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: do-work- spec: arguments: parameters: - name: long-format value: "false" entrypoint: do-work templates: - name: do-work container: image: alpine:3.7 command: ["ls"] args: >- {{- if eq workflow.parameters.long-format "true" }} ["-l", "/etc"] {{- else }} ["/etc"] {{- end }}
方法2:条件式添加参数
直接在args列表中通过条件判断决定是否添加可选参数,写法更简洁:
apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: do-work- spec: arguments: parameters: - name: long-format value: "false" entrypoint: do-work templates: - name: do-work container: image: alpine:3.7 command: ["ls"] args: {{- if eq workflow.parameters.long-format "true" }} - "-l" {{- end }} - "/etc"
方法3:分支模板拆分逻辑
如果后续有更多可选参数,将不同场景拆分为独立模板会更清晰:
apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: do-work- spec: arguments: parameters: - name: long-format value: "false" entrypoint: choose-template templates: - name: choose-template steps: - - name: run-command template: {{ if eq workflow.parameters.long-format "true" }}ls-long{{ else }}ls-normal{{ end }} - name: ls-normal container: image: alpine:3.7 command: ["ls", "/etc"] - name: ls-long container: image: alpine:3.7 command: ["ls", "-l", "/etc"]
验证效果
- 执行
argo submit do-work.yaml或argo submit do-work.yaml -p long-format=false时,运行ls /etc - 执行
argo submit do-work.yaml -p long-format=true时,运行ls -l /etc
内容的提问来源于stack exchange,提问作者Kevin Pauli
相关产品推荐
相关产品推荐

