go - 尝试评估丢失的嵌套键时,Helm 图表失败并显示 "nil pointer evaluating interface {}"

标签 go kubernetes-helm sprig-template-functions

我正在编写 Helm 3 库图表并想创建一个具有默认值的 YAML。但是,当尝试为 设置默认值时嵌套 不存在的 key ,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定义,模板将呈现良好和值 replicas即使 .Values.deployment.scale.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 }}

关于go - 尝试评估丢失的嵌套键时,Helm 图表失败并显示 "nil pointer evaluating interface {}",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61154736/

相关文章:

go - 无法将 JSON 解码为结构

go - 如何覆盖golang中的文件内容

go - 从 Helm 图中的值文件读取值时的默认键值

go - 带 Helm 的尺码表

go - 为什么我的代码在不关闭 channel 的情况下处于死锁状态?

arrays - json 解码的正确结构

Kubernetes Helm : "lost connection to pod" and "transport is closing" errors

kubernetes - helm chart yaml 模板中是否有任何子字符串函数?

go - 将两个 if 条件合二为一

regex - helm - 用下划线替换特殊字符