Helm子Chart间调用含Values的命名模板返回null问题
解决Helm伞形Chart中子Chart模板调用时Values为空的问题
问题原因
Helm 中每个子Chart的模板默认使用调用方的上下文,而非定义模板的子Chart自身上下文。当子Chart2调用子Chart1的模板时,模板里的.Values实际指向子Chart2的Values,而非子Chart1的,所以即使子Chart1的Values已配置,也会返回null。
解决方法
1. 显式传递子Chart1的上下文
在子Chart1的模板定义中保持对自身Values的引用,调用时传入子Chart1的完整上下文:
子Chart1的templates/_helpers.tpl定义模板:
{{- define "subchart1.getServicePort" -}} {{- .Values.service.port -}} {{- end -}}
子Chart2中调用模板时传入子Chart1的上下文:
{{- template "subchart1.getServicePort" .Subcharts.subchart1 -}}
这里.Subcharts.subchart1就是子Chart1的完整上下文,模板里的.会指向它,从而正确读取subchart1.Values.service.port。
2. 传递特定参数(更灵活)
如果模板只需要单个值而非完整上下文,可以直接传递所需参数:
子Chart1的模板定义:
{{- define "subchart1.displayPort" -}} 端口号:{{ . }} {{- end -}}
子Chart2中调用时直接传入子Chart1的端口值:
{{- template "subchart1.displayPort" .Subcharts.subchart1.Values.service.port -}}
优化方案
- 模板设计成纯函数式:避免依赖模板内部的
.或$(它们会随调用方变化),始终通过参数传递所需数据,提高模板复用性。 - 统一共享配置:如果多个子Chart需要共用同一配置,可在父Chart的
values.yaml中定义全局配置,通过$.Values.global访问,但子Chart自身的专属配置仍建议通过子Chart上下文传递。 - 添加默认值:在子Chart1的
values.yaml中设置默认端口,避免未配置时返回空值:# subchart1/values.yaml service: port: 8080
内容的提问来源于stack exchange,提问作者jinxx_
相关产品推荐
相关产品推荐

