mit*_*nia 10 go kubernetes-helm sprig-template-functions
我正在编写一个 Helm 3 库图表,并希望创建一个具有默认值的 YAML。但是,当尝试为不存在的嵌套键设置默认值时,Helm 会失败并显示以下错误消息:
nil pointer evaluating interface {}
假设我的 Kubernetes 对象中有这个片段:
{{- if eq (.Values.deployment.scale.type | default "static") "static" }}
replicas: {{ default "3" .Values.deployment.scale.replicas }}
{{- end }}
Run Code Online (Sandbox Code Playgroud)
如果.Values.deployment.scale定义了,模板将呈现良好,即使未定义,其值replicas也将为 3 。.Values.deployment.scale.replicas
但是,如果未定义父键之一,Helm 将失败并显示上述错误消息。例如,如果values.yaml是以下内容:
# values.yaml
deployment:
not_scale: {}
Run Code Online (Sandbox Code Playgroud)
渲染将失败并显示:nil pointer evaluating interface {}.scale
即使其父键未定义,如何为嵌套键设置默认值?
我不认为,你可以为这种情况设置默认值。您需要预先检查scale字段是否存在。为此,您可以使用hasKeysprig 中的函数:
{{- 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 }}
Run Code Online (Sandbox Code Playgroud)
我决定通过逐步评估层次结构来解决此问题,并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 }}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29111 次 |
| 最近记录: |