Helm图表中如何将Values值注入files目录文件并在ConfigMap中渲染生效?
Helm图表中如何将Values值注入files目录文件并在ConfigMap中渲染生效?
我来帮你搞定这个问题!你遇到的情况其实挺典型的——直接用.Files.Get读取files目录下的文件时,Helm只会原封不动地把内容读出来,不会自动解析里面的模板语法,所以才会出现{{ .Values.someValue }}没被替换成42的情况。
要解决这个问题,关键是让Helm把files里的文件当成模板来渲染,这里可以用Helm的tpl函数来实现。具体修改你的configMap.yaml即可:
修改前的代码里,你是直接读取文件内容后加引号:
{{ base $path }}: {{ $root.Files.Get $path | quote }}
把它改成用tpl函数先渲染内容,再处理:
apiVersion: v1 kind: ConfigMap metadata: name: my-config namespace: my data: {{- $root := . }} {{- range $path, $bytes := .Files.Glob "files/*" }} {{ base $path }}: {{ tpl ($root.Files.Get $path) $root | quote }} {{- end }}
简单解释下这个修改:
tpl函数的作用就是把第一个参数(也就是我们读取到的文件内容)当成Helm模板,用第二个参数(这里的$root,也就是整个Chart的上下文,包含了Values、Release等所有可用变量)去渲染它。- 渲染完成后再用
quote把内容转成适合ConfigMap的字符串格式。
这样当你执行helm install时,files/app.yml里的{{ .Values.someValue }}就会被正确替换成42,最终生成的ConfigMap内容就是你想要的:
some: value: 42
另外要注意两个小细节:
- 确保
files目录下的文件内容是合法的Helm模板语法,不然渲染过程可能会报错。 tpl函数是Helm 2.10版本之后才支持的,如果你的Helm版本太旧,可能需要先升级到新版本。
备注:内容来源于stack exchange,提问作者atygaev.mi
相关产品推荐
相关产品推荐

