如何在Argo Workflow中通过参数设置动态长度的args列表?
解决Argo工作流参数转列表类型的问题
方法1:用fromJson解析JSON字符串参数
Argo仅支持字符串参数,但可以通过模板内置的fromJson函数,把传入的JSON格式字符串直接解析成列表类型,完美适配args的需求。
操作步骤:
- 在Workflow定义里声明字符串参数,然后在容器的args中用
fromJson解析该参数:
apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: list-args-demo- spec: arguments: parameters: - name: message value: '["foo", "bar", "baz"]' # 可选设置默认值 templates: - name: echo-args container: image: alpine:latest command: ["echo"] args: {{fromJson .workflow.parameters.message}}
- 提交命令时注意引号的正确使用(避免shell破坏内部JSON格式):
# 用单引号包裹JSON字符串 argo submit something.yaml -p message='["foo", "bar", "baz"]' # 或者转义双引号 argo submit something.yaml -p message="[\"foo\", \"bar\", \"baz\"]"
这样就能直接得到["foo", "bar", "baz"]格式的列表作为args,不会出现嵌套的情况。
方法2:用逗号分隔字符串+split函数分割
如果不想用JSON格式,也可以传递逗号分隔的字符串,再用split函数分割成列表:
操作步骤:
- 修改Workflow模板,用
split处理参数:
apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: split-args-demo- spec: arguments: parameters: - name: message value: "foo,bar,baz" templates: - name: echo-args container: image: alpine:latest command: ["echo"] args: {{split .workflow.parameters.message ","}}
- 提交命令更简洁:
argo submit something.yaml -p message="foo,bar,baz"
原方法失效原因
你之前的提交命令中,传入的JSON字符串被shell处理后,最终以单个字符串参数的形式进入Argo,所以args会把这个单字符串包装成['["foo", "bar", "baz"]']的嵌套列表。而用fromJson或split函数,会直接把字符串解析成多元素的列表,正好匹配需求。
内容的提问来源于stack exchange,提问作者idan ahal
相关产品推荐
相关产品推荐

