如何解决将缩小的Yaml作为参数传递给kubernetes作业
这是我经常使用的kubernetes作业YAML配置的简化版本:
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
template:
spec:
containers:
- name: mycontainer
image: me/mycontainer:latest
command: ["bash","-c"]
args:
- python -u myscript.py
--param1 abc
--param2 xyz
以上方法效果很好,并且易于维护和阅读。但是现在我的参数之一需要一些缩小的YAML:
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
template:
spec:
containers:
- name: mycontainer
image: me/mycontainer:latest
command: ["bash","-c"]
args:
- python -u myscript.py
--param_minified_yaml "{key: value}"
kubectl
正在解析这部分嵌入式缩小的Yaml,并导致:error: error parsing STDIN: error converting YAML to JSON: yaml: line 26: mapping values are not allowed in this context
如何将args:
中嵌入的yaml转义为纯文本参数?
解决方法
如果缩小的yaml(或一般的args字符串)不包含单引号,则可以将整个命令行包装在其中:
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
template:
spec:
containers:
- name: mycontainer
image: me/mycontainer:latest
command: ["bash","-c"]
args:
- 'python -u myscript.py
--param_minified_yaml "{key: value}"'
如果arg字符串包含单引号,则args字符串可以作为YAML multiline string传递:
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
template:
spec:
containers:
- name: mycontainer
image: me/mycontainer:latest
command: ["bash","-c"]
args:
- >-
python -u myscript.py
--param_minified_yaml "{key: 'value'}"
,
您可以在此处使用block scalar:
args:
- >
python -u myscript.py
--param_minified_yaml "{key: value}"
尝试使用yaml validator or converter中的不同标量格式来了解它们之间的差异。
, bash -c
包装器将整个实际命令强制为单个参数,然后导致转义和引用方面的问题。除非您实际上需要调用外壳程序(也许是要插入环境变量),否则最好将其删除。那么command:
是单词列表;您负责将命令分解为单个单词,但是相反,您可以为每个单个单词使用任何有效的YAML语法。
所以我在这里写:
command:
- python
- -u
- myscript.py
- --param_minified_yaml
- '{key: value}' # in quotes,so it is a YAML string
其他答案中建议的任何语法变化都可以使用,并且您可以根据参数进行混合和匹配。
command:
- ...
- --param_minified_yaml
- >- # block scalar syntax,again makes a string
{key: value}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。