这是一个玩具示例
{{/*Merge a list of objects*/}}
{{- define "mymerge" }}
{{- toYaml (merge .) }}
{{- end }}
{{- define "mymergewrapper" }}
{{- $dict1 := (dict "data" (dict "dict1key" "dict1val"))}}
{{- $dict2 := (dict "data" (dict "dict2key" "dict2val"))}}
{{- $dict3 := (dict "data" (dict "dict3key" "dict3val"))}}
{{- $dict4 := (dict "data" (dict "dict3key" "dict4val"))}}
{{- $arbitrary_list_of_dicts_of_unknown_length_and_content := (list $dict1 $dict2 $dict3 $dict4) }}
{{- include "mymerge" $arbitrary_list_of_dicts_of_unknown_length_and_content }}
{{- end }}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name | printf "%s-%s" .Chart.Name }}
data:
myvalue: "Hello World"
whatHappens:
{{- include "mymergewrapper" . }}
helm install myappchart2 myappchart2/ --debug --dry-run
Error: INSTALLATION FAILED: template: myappchart2/templates/deployment.yaml:22:6: executing "myappchart2/templates/deployment.yaml" at <include "mymergewrapper" .>: error calling include: template: myappchart2/templates/deployment.yaml:12:8: executing "mymergewrapper" at <include "mymerge" $arbitrary_list_of_dicts_of_unknown_length_and_content>: error calling include: template: myappchart2/templates/deployment.yaml:3:22: executing "mymerge" at <.>: wrong type for value; expected map[string]interface {}; got []interface {}
helm.go:84: [debug] template: myappchart2/templates/deployment.yaml:22:6: executing "myappchart2/templates/deployment.yaml" at <include "mymergewrapper" .>: error calling include: template: myappchart2/templates/deployment.yaml:12:8: executing "mymergewrapper" at <include "mymerge" $arbitrary_list_of_dicts_of_unknown_length_and_content>: error calling include: template: myappchart2/templates/deployment.yaml:3:22: executing "mymerge" at <.>: wrong type for value; expected map[string]interface {}; got []interface {}
我读到“将两个或更多字典合并为一个......”有点太快了。
有没有办法解压我的
$objects
列表并将各个字典传递给 merge
?
合并函数有一个可变参数。 模板不支持将切片作为可变参数传递。
使用循环逐一合并:
{{- $dict1 := (dict "data" (dict "dict1key" "dict1val")) }}
{{- $dict2 := (dict "data" (dict "dict2key" "dict2val")) }}
{{- $dict3 := (dict "data" (dict "dict3key" "dict3val")) }}
{{- $dict4 := (dict "data" (dict "dict3key" "dict4val")) }}
{{- $objects := (list $dict1 $dict2 $dict3 $dict4) }}
{{- $dest := (dict) }}
{{- range $objects}}{{merge $dest .}}{{end}}
{{- toYaml $dest }}