Helm 的 v3 示例不显示多行属性。获取 YAML 到 JSON 解析错误

Helm's v3 Example Doesn't Show Multi-line Properties. Get YAML to JSON parse error

在Helm的v3文档中:Accessing Files Inside Templates,作者给出了3个属性(toml)文件的例子;其中每个文件只有一对 key/value。

configmap.yaml 看起来像这样。为了简单起见,我只添加了一个 config.toml

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-config
data:
  {{- $files := .Files }}
  {{- range tuple "config.toml" }}
  {{ . }}: |-
    {{ $files.Get . }}
  {{- end }}

这工作正常,直到我将 second 行添加到 config.toml 文件。

config.toml

replicaCount=1
foo=bar

然后我得到一个错误:INSTALLATION FAILED: YAML parse error on deploy/templates/configmap.yaml: error converting YAML to JSON: yaml: line 9: could not find expected ':'

如有任何想法,我们将不胜感激。 谢谢

Helm 将读取该文件,但它(无论好坏)是一个 text 模板引擎。它不了解您正在尝试编写 YAML 文件,因此它不会帮助您。这实际上就是为什么您会在野外看到这么多带有 {{ .thing | indent 8 }}{{ .otherThing | toYaml }} 的模板的原因——因为 you need to help Helm 知道它在什么上下文中发出 text

因此,在您的特定情况下,您需要值为 4 的 indent filter,因为您当前的模板有两个空格用于键缩进级别,还有两个空格用于值块标量

data:
  {{- $files := .Files }}
  {{- range tuple "config.toml" }}
  {{ . }}: |-
{{ $files.Get . | indent 4 }}
{{/* notice this ^^^ template expression is flush left,
because the 'indent' is handling whitespace, not the golang template itself */}}
  {{- end }}

此外,虽然这是对您问题的具体答案,但不要忽视 .AsConfig section on that page 这似乎更可能是您真正想要发生的事情,并且需要较少的 indent 数学