You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jsonnet/Ksonnet中编写多行值生成Kubernetes ConfigMap

如何在Jsonnet的parts函数中生成带多行内容的Kubernetes ConfigMap

我来帮你搞定这个问题——在Jsonnet里生成包含多行脚本的ConfigMap,关键是要正确处理YAML的块标量格式,你之前的写法没抓住Jsonnet处理多行字符串的要点。

问题根源

你之前直接把|- line1 line2写在字符串里,Jsonnet不会自动把它解析成YAML的块标量语法,反而会把整个内容当成普通字符串输出,自然不符合预期。

正确写法1:用Jsonnet原生多行字符串(推荐)

Jsonnet支持用|||-(或""")包裹多行字符串,这种写法会直接保留换行,并且生成YAML时会自动适配块标量格式:

parts:: {
  bootstrap(p):: {
    apiVersion: 'v1',
    kind: 'ConfigMap',
    metadata: {
      name: p.name + '-bootstrap',
      labels: {
        app: p.app,
        release: p.release,
      },
    },
    data: {
      'run.sh': |||-
        echo "Waiting to run nslookup..."
        sleep 30
      |||
    }
  }
}

这种写法的优势是直观,和你最终想要的YAML脚本内容几乎完全一致,生成的结果会完美匹配你给出的示例YAML。

正确写法2:动态拼接多行内容(适合需要变量注入的场景)

如果你的脚本内容需要动态生成(比如根据参数调整sleep时间),可以用std.join把字符串数组拼接成多行字符串:

parts:: {
  bootstrap(p):: {
    apiVersion: 'v1',
    kind: 'ConfigMap',
    metadata: {
      name: p.name + '-bootstrap',
      labels: {
        app: p.app,
        release: p.release,
      },
    },
    data: {
      'run.sh': std.join('\n', [
        'echo "Waiting to run nslookup..."',
        'sleep 30',
        // 这里可以添加动态内容,比如从参数p中读取值
        'echo "Bootstrap completed for release: ' + p.release + '"'
      ])
    }
  }
}

这种方式生成的YAML同样会正确识别多行内容,Kubernetes的ConfigMap也能正常读取脚本。

验证生成结果

用上面两种写法生成的YAML都会和你预期的一致:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nifi-bootstrap
  labels:
    app: nifi
    release: nifi
data:
  run.sh: |-
    echo "Waiting to run nslookup..."
    sleep 30

内容的提问来源于stack exchange,提问作者Xiang Zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:20:53