You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 13:07:07