Go 舵图失败,带“;零指针求值接口{}”;尝试计算缺少的嵌套键时

Go 舵图失败,带“;零指针求值接口{}”;尝试计算缺少的嵌套键时,go,kubernetes-helm,sprig-template-functions,Go,Kubernetes Helm,Sprig Template Functions,我正在编写一个Helm 3库图表,并希望创建一个带有默认值的YAML。但是,当尝试为不存在的嵌套键设置默认值时,Helm失败,并显示以下错误消息: nil指针求值接口{} 假设我的Kubernetes对象中有这个片段: {-if eq(.Values.deployment.scale.type |默认为“static”)“static”} 副本:{{default“3”.Values.deployment.scale.replications} {{-end} 如果定义了.Values.dep

我正在编写一个Helm 3库图表,并希望创建一个带有默认值的YAML。但是,当尝试为不存在的嵌套键设置默认值时,Helm失败,并显示以下错误消息:

nil指针求值接口{}

假设我的Kubernetes对象中有这个片段:

{-if eq(.Values.deployment.scale.type |默认为“static”)“static”}
副本:{{default“3”.Values.deployment.scale.replications}
{{-end}
如果定义了
.Values.deployment.scale
,则即使未定义
.Values.deployment.scale.replications
,模板也将呈现良好,并且
副本的值将为3

但是,如果未定义其中一个父键,Helm将失败并显示上述错误消息。例如,如果
values.yaml
如下所示:

#values.yaml
部署:
非比例:{}
渲染将失败:
nil指针求值接口{}.scale


即使嵌套键的父键未定义,如何为其设置默认值呢?

我不认为,您可以为这种情况设置默认值。您需要预先检查
scale
字段是否存在。为此,您可以使用:


我决定使用层次结构的逐步评估来解决这个问题,如果键不存在,则使用
default dict
分配一个空映射。它既有效又看起来更好

例如:

{{$deployment:=default dict.Values.deployment}
{{$scale:=默认dict$deployment.scale}
{{-if eq($scale.type |默认为“static”)“static”}
副本:{default“3”$scale.replications}
{{-end}
{{- if hasKey .Values.deployment "scale" }}
{{- if eq (.Values.deployment.scale.type | default "static") "static" }}
replicas: {{ default "3" .Values.deployment.scale.replicas }}
{{- end }}
{{- else }}
replicas: 3
{{- end }}