假设我有一个名为“child”的 Helm 图表,包含以下内容
values.yaml
name: "John"
greeting: "Hello {{ .Values.name }}"
还有一个模板
test.yaml
包含以下内容:
result: {{ tpl .Values.greeting $ }}
如果我运行
helm template .
命令,我得到这个输出:
---
# Source: child/templates/test.yaml
result: Hello John
现在我有一个依赖于“子”子图的“父”图。它在
Chart.yaml
中声明为:
dependencies:
- name: child
version: "0.1.0"
repository: "file://charts/child"
父图表的
values.yaml
包含:
rename: "Wilson"
child:
name: {{ .Values.rename }}
如果我从父图表目录运行
helm template .
命令,我得到这个错误:
Error: cannot load values.yaml: error converting YAML to JSON: yaml: invalid map key: map[interface {}]interface {}{".Values.rename":interface {}(nil)}
我想得到输出:
---
# Source: parent/charts/child/templates/test.yaml
result: Hello Wilson
有什么方法可以将值“重命名”从父子图传递给子子图吗?
注意事项:
这是不可能的,即使你可以修改子图表。
Helm 不会让父图表对传递给子图表的值有任何控制。它始终是
child
值的内容合并了 global
值。模板代码或 Chart.yaml
中的任何内容都不能修改它。
即使您可以修改子图表,通常的方法是使用 Helm
tpl
函数,但是当子图表可以看到这个值时,父值已经被隐藏了。
在父图表中,如果您只是想避免这种重复,您可以看到
.Values.child
并可以像使用任何其他值一样使用它。
# parent/templates/test.yaml
resultFromParent: {{ .Values.child.name }}
可以预处理值文件或使用允许其他构造的其他工具。我熟悉的一个工具是 Helmfile,它允许您使用 Helm 风格的模板来为 Helm 图表构建值;它还允许您并行安装多个图表,这可以解决一些需要“伞状”图表的情况。