将缩小的 yaml 作为参数传递给 kubernetes 作业



这是我常用的 kubernetes job 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}"

这个嵌入的缩小的yaml正在被kubectl解析并导致: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 多行字符串传递:

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'}"

您可以在此处使用块标量:

args:
- >
python -u myscript.py
--param_minified_yaml "{key: value}"

在 yaml 验证器或转换器中尝试不同的标量格式,以了解它们的差异。

bash -c包装器强制将整个实际命令放入单个参数中,然后导致转义和引用的问题。 除非你真的需要调用一个shell(也许是为了插入环境变量),否则最好删除它。 然后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}

最新更新