当未定义值时,防止“范围”块在空映射上执行

问题描述 投票:0回答:1

使用

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 会将其视为空映射。

有什么解决办法吗?

kubernetes-helm istio
1个回答
0
投票

最简单的答案是将

authorizationPolicies: []
的定义作为空列表包含在图表的
values.yaml
文件中。安装图表的人仍然可以使用
helm install -f
备用值文件提供不同的值。

第二个最简单的答案是在设置

range
循环时提供默认的空列表

{{ range .Values.authorizationPolicies | default list }}
...
{{ end }}

如果该值未在任何地方定义,则

.Values.authorizationPolicies
具有特殊值
nil
。这与空列表或空地图不同;出于条件或
default
函数的目的,它被视为“假”。在底层 Go 实现中,模板引擎必须使用的最佳 Go 类型是“anything”类型
interface{}
,这就是您在错误消息中看到它的原因。

© www.soinside.com 2019 - 2024. All rights reserved.