我在 config_map.yaml 和 helm 值文件中有以下模板。
在cm模板中我有以下内容:
"VARKEY": {{.Values.VARKEY}}
在值文件中我有以下内容:
"VARKEY": ["var1", "var2"]
当我创建 ConfigMap 或使用 helm 模板来测试它时,我收到以下内容。
"VARKEY": [var1 var2]
我的应用程序期望的 cm 值如下。 预期输出:
"VARKEY": ["var1", "var2"]
如何达到预期产出
我如何实现预期的输出,为什么 Helm 更改值文件中的数据?
您的值是一个 YAML 列表,您可以在模板代码中看到该结构。 ConfigMap 的值始终是字符串,您还需要确保输出是 YAML 字符串而不是其他类型的结构。
一个答案是明确引用
values.yaml
中的值,然后您将得到您期望的输出(需要小心)。
# values.yaml
VARKEY: '["var1", "var2"]'
# templates/configmap.yaml
data:
VARKEY: {{ squote .Values.VARKEY }}
另一种选择是继续接受列表语法中的值,但然后在输出中将其显式呈现为 JSON。只需写出
{{ $someList }}
就会从 Go 模板引擎获得默认格式,这并不是特别有用;您需要使用 toJson
模板函数 来恢复 JSON 语法。
# values.yaml
"VARKEY": ["var1", "var2"]
# equivalently (with a different name, but same structure)
varKey:
- var1
- var2
# templates/configmap.yaml
data:
VARKEY: |-
{{ .Values.VARKEY | toJson | indent 4 }}
在最后一个示例中,我明确使用 YAML 块标量语法。这通常会创建一个多行字符串(如果您需要的话,可以与
toYaml
很好地配对)。在 YAML 中的各种引用和转义机制中,它是唯一对字符串内容不敏感的机制,前提是您在每行的开头放置了一致数量的空格(即 indent
it)。使用 squote
将字符串放在单引号中对包含单引号的字符串本身很敏感,与 quote
和双引号类似。