Helm渲染ConfigMap模板报错expected string; got bool问题咨询
问题根因
报错是因为模板中range遍历的范围是整个.Values.configMap对象,新增的enabled: true是布尔类型字段,也被纳入了遍历逻辑。而tpl函数要求传入的待渲染内容必须是字符串类型,当遍历到enabled字段时拿到布尔值,就会触发类型不匹配错误。
修复方案
优先推荐使用配置分层的方案,这是Helm生态的通用实践,后续新增其他控制参数时也不会出现同类问题:
- 调整
values.yaml结构,将启用开关和实际ConfigMap内容拆分到不同层级,所有配置文件内容放到data字段下:
configMap: enabled: true data: config.json: | food = pizza drink = soda
- 对应修改
configmap.yaml模板,将遍历范围调整为.Values.configMap.data,仅遍历实际配置项:
{{- if .Values.configMap.enabled }} apiVersion: v1 kind: ConfigMap metadata: namespace: {{ .Release.Namespace }} name: {{include "chart.fullname" .}} labels: {{ include "chart.labels" . | nindent 4 }} data: {{- range $name, $config := .Values.configMap.data }} {{ $name }}: | {{ tpl $config $ | indent 4 }} {{- end }} {{- end -}}
如果不想修改原有values的配置结构,也可以在遍历时增加类型判断,跳过非字符串类型的控制字段:
{{- if .Values.configMap.enabled }} apiVersion: v1 kind: ConfigMap metadata: namespace: {{ .Release.Namespace }} name: {{include "chart.fullname" .}} labels: {{ include "chart.labels" . | nindent 4 }} data: {{- range $name, $config := .Values.configMap }} {{- if kindIs "string" $config }} {{ $name }}: | {{ tpl $config $ | indent 4 }} {{- end }} {{- end }} {{- end -}}
注意:分层方案的可维护性远高于字段过滤方案,后续如果要给configMap新增
annotations、labels等其他非配置类参数,不需要再额外修改遍历过滤逻辑。
内容的提问来源于stack exchange,提问作者Chanafot
相关产品推荐
相关产品推荐

