Helm tpl函数无法传入dict等非根上下文的问题咨询
Helm tpl函数传入自定义dict上下文报错的原因及解决办法
问题场景
作为Helm/Go模板新手,在使用tpl函数时遇到如下问题:
- 初始测试:
stubs/.test.yaml模板中用{{.Values.key}},通过{{ tpl (.Files.Get "stubs/.test.yaml" ) (.) }}传入根上下文,能正常渲染出test2: value(values.yaml中定义key: value)。 - 修改后测试:将模板改为
{{.key}},通过{{ tpl (.Files.Get "stubs/.test.yaml" ) (dict "key" .Values.key) }}传入自定义dict作为上下文,触发错误:error calling tpl: cannot retrieve Template.Basepath from values inside tpl function: test: abc test2: {{.key}}: "BasePath" is not a value - 进一步测试发现,只有传入
.作为tpl函数的第二个参数才能正常运行,使用版本为Helm 3.10。
原因分析
Helm的tpl函数内部依赖根上下文(.)中包含的Helm自动注入的元数据字段,比如Template.Basepath。当你传入纯自定义的dict作为上下文时,这个字典里没有这些Helm渲染必需的内置元数据,导致tpl函数执行时找不到这些字段,从而抛出错误。
解决办法
方法一:合并自定义数据与根上下文
使用Helm的merge函数,将你的自定义dict和根上下文合并,这样既保留自定义数据,又不丢失Helm需要的元数据:{{ tpl (.Files.Get "stubs/.test.yaml") (merge (dict "key" .Values.key) .) }}此时模板中用
{{.key}}即可正常渲染出对应的值。方法二:手动添加必要的内置字段(不推荐)
如果你确定只需要部分元数据,可以手动在自定义dict中添加tpl函数必需的字段,但这种方法会因Helm版本更新导致兼容性问题,不建议生产环境使用:{{ tpl (.Files.Get "stubs/.test.yaml") (dict "key" .Values.key "Template" .Template) }}
内容的提问来源于stack exchange,提问作者Martin Mucha
相关产品推荐
相关产品推荐

