有时我们需要使用Base Template来同时生成两个稍微有点差别的manifest文件。
如果你只需要更改Map里面的内容,一种很容易的方式是直接合并生成好的YAML。但对于Containers
以及Volumes
这种数组类型,合并YAML就不是很容易了。
另外一种方式,是生成本地修改的.Values
,具体内容如下:
templates/_util.tpl
:
{{- /*
chart.util.merge will merge a YAML value file with context,
use it to generate another YAML file and output the result.
This takes an array of three values:
- the top context
- the name of the value overrides
- the name of the target template
*/ -}}
{{- define "chart.util.merge" -}}
{{- $top := first . -}}
{{- $overrides := fromYaml (include (index . 1) $top) | default (dict ) -}}
{{- include (index . 2) (merge $overrides $top) -}}
{{- end -}}
templates/_parent.yaml
:
{{/*
Parent Base Template
*/}}
{{- define "chart.parent.tpl" -}}
Current Value: {{ .Values.test.key.value }}
{{- end -}}
{{- define "chart.parent" -}}
{{- include "chart.util.merge" (append . "chart.parent.tpl") -}}
{{- end -}}
templates/child1.yaml
:
{{- include "chart.parent" (list . "chart.parent.child1") -}}
{{- define "chart.parent.child1" -}}
Values:
test:
key:
value: child1
{{- end -}}
templates/child2.yaml
:
{{- include "chart.parent" (list . "chart.parent.child2") -}}
{{- define "chart.parent.child2" -}}
Values:
test:
key:
value: child2
{{- end -}}
values.yaml
:
test:
key: {}
# This value is provided by child1.yaml or child2.yaml
#value: parent
最后结果如下:
$ helm template test test
---
# Source: test/templates/child1.yaml
Current Value: child1
---
# Source: test/templates/child2.yaml
Current Value: child2