使用
range
迭代器时,我遇到了奇怪的 helm 行为。我的模板看起来像这样
{{- range .Values.authorizationPolicies -}}
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: {{ .name }}-authorization-policy
...
{{- end -}}
当我没有从 value.yaml 中设置任何内容时,我会看到下面的错误
Error: INSTALLATION FAILED: template: microservice/templates/authorization-policies.yaml:5:11: executing "microservice/templates/authorization-policies.yaml" at <.name>: can't evaluate field name in type interface {}
helm.go:84: [debug] template: microservice/templates/authorization-policies.yaml:5:11: executing "microservice/templates/authorization-policies.yaml" at <.name>: can't evaluate field name in type interface {}
INSTALLATION FAILED
main.newInstallCmd.func2
helm.sh/helm/v3/cmd/helm/install.go:154
github.com/spf13/cobra.(*Command).execute
github.com/spf13/[email protected]/command.go:940
github.com/spf13/cobra.(*Command).ExecuteC
github.com/spf13/[email protected]/command.go:1068
github.com/spf13/cobra.(*Command).Execute
github.com/spf13/[email protected]/command.go:992
main.main
helm.sh/helm/v3/cmd/helm/helm.go:83
runtime.main
runtime/proc.go:267
runtime.goexit
runtime/asm_arm64.s:1197
但是,如果我定义
authorizationPolicies: []
,则范围不会迭代。
在我看来,Helm 不区分不存在的值和空列表或映射。如果值文件中未指定该值,Helm 会将其视为空映射。
有什么解决办法吗?
最简单的答案是将
authorizationPolicies: []
的定义作为空列表包含在图表的 values.yaml
文件中。安装图表的人仍然可以使用 helm install -f
备用值文件提供不同的值。
第二个最简单的答案是在设置
range
循环时提供默认的空列表
{{ range .Values.authorizationPolicies | default list }}
...
{{ end }}
如果该值未在任何地方定义,则
.Values.authorizationPolicies
具有特殊值 nil
。这与空列表或空地图不同;出于条件或 default
函数的目的,它被视为“假”。在底层 Go 实现中,模板引擎必须使用的最佳 Go 类型是“anything”类型 interface{}
,这就是您在错误消息中看到它的原因。