Helm模板渲染ConfigMap中JSON数组格式不符合预期的问题咨询
Helm模板渲染ConfigMap中JSON数组格式不符合预期的问题咨询
我来帮你分析和解决这个问题~
问题原因
你遇到的问题本质是Helm默认的模板渲染行为导致的:当你直接在模板里输出{{ .Values.VARKEY }}时,Helm会采用Go语言默认的数组打印格式——不带引号、用空格分隔元素,这完全不符合JSON的语法规范,所以才会出现[var1 var2]这种错误输出。
解决方案
针对你的场景(需要生成合法的JSON格式ConfigMap),这里有两种靠谱的解决方法:
方法一:使用toJson函数(最简便推荐)
Helm内置了toJson函数,可以直接将Go的数据结构转换成标准的JSON格式。你只需要修改模板中的数组渲染部分即可:
修改后的templates/configmap.yaml:
data: conf.json: |+ { "VARKEY": {{ toJson .Values.VARKEY }}, "OTHERKEY_STRING": "{{ .Values.OTHERKEY_STRING }}", "ANOTHERKEY_INT": {{ .Values.ANOTHERKEY_INT }} }
注:我顺便修正了你原模板里的几个JSON语法问题:比如键名需要加双引号(JSON要求键必须是字符串),还有逗号和括号的位置要匹配,避免出现语法错误。
方法二:手动遍历数组拼接JSON格式(适合自定义场景)
如果因为特殊需求不想使用toJson,也可以通过range循环手动拼接合法的JSON数组:
data: conf.json: |+ { "VARKEY": [{{ range $index, $val := .Values.VARKEY }}{{ if $index }}, {{ end }}"{{ $val }}"{{ end }}], "OTHERKEY_STRING": "{{ .Values.OTHERKEY_STRING }}", "ANOTHERKEY_INT": {{ .Values.ANOTHERKEY_INT }} }
这个方法通过range遍历数组元素,利用$index判断是否为第一个元素(避免开头多逗号),给每个元素套上双引号,最终拼接成符合要求的JSON数组。
关于你提到的squote函数
squote函数的作用是给内容添加单引号,而你的场景需要双引号的JSON格式,所以它并不是最合适的选择,优先考虑上面两种方法更稳妥。
备注:内容来源于stack exchange,提问作者SeeMo
相关产品推荐
相关产品推荐

