如何在Helm生成ConfigMap的文件内容中引用循环内定义的变量
问题原因
你调用tpl函数渲染文件内容时,传入的第二个参数是Chart根上下文$,循环内定义的局部变量$path没有被包含在这个上下文里,因此文件内无法直接引用该变量,抛出未定义错误。
解决方法
方法1:合并自定义变量到渲染上下文(改动最小)
这个方案可以保留你现有文件中.Values相关的引用无需修改,只需调整两处代码:
- 修改ConfigMap模板的
tpl调用行,用merge函数把循环变量合并到根上下文:
apiVersion: v1 kind: ConfigMap metadata: name: {{ template "proj.name" . }} labels: app.kubernetes.io/name: {{ include "proj.name" . }} app.kubernetes.io/version: {{ include "proj.version" . }} data: {{- range $path, $_ := .Files.Glob "myconfig/*.txt" -}} {{ $path | base | nindent 2 }}: | {{- tpl ($.Files.Get $path) (merge (dict "path" $path) $) | nindent 4 }} {{- end -}}
- 修改
myconfig/name.txt中的变量引用,把全局变量格式的{{ $path }}改为上下文变量格式{{ .path }}:
i am able to access this -> {{ .Values.somekey }} Now can access this -> {{ .path }}
如果你只需要文件名不需要完整路径,可以在合并时直接传处理后的结果:(dict "filename" ($path | base)),文件内直接引用{{ .filename }}即可。
方法2:构造独立上下文
如果需要隔离全局上下文避免污染,也可以自定义渲染上下文,把需要用到的所有变量明确传入:
- 调整
tpl调用参数:
{{- tpl ($.Files.Get $path) (dict "Values" $.Values "CurrentPath" $path) | nindent 4 }}
- 对应修改文件内的所有变量引用:
i am able to access this -> {{ .Values.somekey }} Now can access this -> {{ .CurrentPath }}
内容的提问来源于stack exchange,提问作者Vijayendar Gururaja
相关产品推荐
相关产品推荐

