将缩小的 yaml 作为参数传递给 kubernetes 作业
Passing minified yaml as an argument to a kubernetes job
这是我常用的 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
包装器将整个实际命令强制为单个参数,然后导致转义和引用问题。除非您确实需要调用 shell(也许是为了插入环境变量),否则最好将其删除。然后 command:
是一个单词列表;您负责将命令分解成单独的单词,但相反,您可以对每个单独的单词使用任何有效的 YAML 语法。
所以在这里我可能会写:
command:
- python
- -u
- myscript.py
- --param_minified_yaml
- '{key: value}' # in quotes, so it is a YAML string
其他答案中建议的任何语法变体都有效,您可以在 per-argument 基础上混合搭配。
command:
- ...
- --param_minified_yaml
- >- # block scalar syntax, again makes a string
{key: value}
这是我常用的 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
包装器将整个实际命令强制为单个参数,然后导致转义和引用问题。除非您确实需要调用 shell(也许是为了插入环境变量),否则最好将其删除。然后 command:
是一个单词列表;您负责将命令分解成单独的单词,但相反,您可以对每个单独的单词使用任何有效的 YAML 语法。
所以在这里我可能会写:
command:
- python
- -u
- myscript.py
- --param_minified_yaml
- '{key: value}' # in quotes, so it is a YAML string
其他答案中建议的任何语法变体都有效,您可以在 per-argument 基础上混合搭配。
command:
- ...
- --param_minified_yaml
- >- # block scalar syntax, again makes a string
{key: value}