尝试评估缺少的嵌套键时,Helm 图表失败并显示 "nil pointer evaluating interface {}"
Helm chart fails with "nil pointer evaluating interface {}" when trying to evaluate a missing nested key
我正在编写一个 Helm 3 库图表,并想创建一个具有默认值的 YAML。但是,当尝试为不存在的 nested 键设置默认值时,Helm 失败并显示以下错误消息:
nil pointer evaluating interface {}
假设我的 Kubernetes 对象中有这个片段:
{{- if eq (.Values.deployment.scale.type | default "static") "static" }}
replicas: {{ default "3" .Values.deployment.scale.replicas }}
{{- end }}
如果定义了 .Values.deployment.scale
,即使未定义 .Values.deployment.scale.replicas
,模板也能正常渲染,replicas
的值将为 3。
但是,如果未定义其中一个父键,Helm 将失败并显示上述错误消息。例如,如果 values.yaml
如下:
# values.yaml
deployment:
not_scale: {}
渲染将失败:nil pointer evaluating interface {}.scale
如何为嵌套键设置默认值,即使其父键未定义?
我不认为,您可以为这种情况设置默认值。您需要预先检查 scale
字段是否存在。为此,您可以使用 hasKey
function from sprig:
{{- 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 }}
我决定使用层次结构的逐步评估来解决这个问题,如果键不存在,则使用 default dict
分配一个空映射。它既有效又看起来更好。
示例:
{{ $deployment := default dict .Values.deployment }}
{{ $scale := default dict $deployment.scale }}
{{- if eq ($scale.type | default "static") "static" }}
replicas: {{ default "3" $scale.replicas }}
{{- end }}
我正在编写一个 Helm 3 库图表,并想创建一个具有默认值的 YAML。但是,当尝试为不存在的 nested 键设置默认值时,Helm 失败并显示以下错误消息:
nil pointer evaluating interface {}
假设我的 Kubernetes 对象中有这个片段:
{{- if eq (.Values.deployment.scale.type | default "static") "static" }}
replicas: {{ default "3" .Values.deployment.scale.replicas }}
{{- end }}
如果定义了 .Values.deployment.scale
,即使未定义 .Values.deployment.scale.replicas
,模板也能正常渲染,replicas
的值将为 3。
但是,如果未定义其中一个父键,Helm 将失败并显示上述错误消息。例如,如果 values.yaml
如下:
# values.yaml
deployment:
not_scale: {}
渲染将失败:nil pointer evaluating interface {}.scale
如何为嵌套键设置默认值,即使其父键未定义?
我不认为,您可以为这种情况设置默认值。您需要预先检查 scale
字段是否存在。为此,您可以使用 hasKey
function from sprig:
{{- 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 }}
我决定使用层次结构的逐步评估来解决这个问题,如果键不存在,则使用 default dict
分配一个空映射。它既有效又看起来更好。
示例:
{{ $deployment := default dict .Values.deployment }}
{{ $scale := default dict $deployment.scale }}
{{- if eq ($scale.type | default "static") "static" }}
replicas: {{ default "3" $scale.replicas }}
{{- end }}