【问题标题】:Passing minified yaml as an argument to a kubernetes job将缩小的 yaml 作为参数传递给 kubernetes 作业
【发布时间】:2021-01-26 22:25:01
【问题描述】:

这是我常用的 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 如何进行转义,使其作为纯文本参数传递?

【问题讨论】:

    标签: kubernetes yaml kubectl


    【解决方案1】:

    如果缩小的 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'}"
    

    【讨论】:

    • 仔细观察块文本的缩进,在--param_minified_yaml 中添加额外的空格,就像我在原始示例中所做的那样,将添加换行符。这花了我几分钟的时间来解决。除此之外,这很好用!
    【解决方案2】:

    您可以在此处使用block scalar

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

    yaml validator or converter 中尝试不同的标量格式以了解它们的区别。

    【讨论】:

      【解决方案3】:

      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}
      

      【讨论】:

        猜你喜欢
        • 2019-03-15
        • 2015-05-06
        • 1970-01-01
        • 2022-09-25
        • 2012-07-03
        • 1970-01-01
        • 2021-06-13
        • 1970-01-01
        • 2011-09-19
        相关资源
        最近更新 更多