将缩小的 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}