【问题标题】:Helm chart fails with "nil pointer evaluating interface {}" when trying to evaluate a missing nested key尝试评估缺少的嵌套键时,Helm 图表因“nil 指针评估接口 {}”而失败
【发布时间】:2020-04-11 09:40:54
【问题描述】:

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

nil pointer evaluating interface {}

假设我的 Kubernetes 对象中有这个 sn-p:

{{- 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

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

【问题讨论】:

    标签: go kubernetes-helm sprig-template-functions


    【解决方案1】:

    我不认为,您可以为这种情况设置默认值。您需要预先检查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 }}
    

    【讨论】:

      【解决方案2】:

      我决定通过逐步评估层次结构并使用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 }}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-18
        • 1970-01-01
        • 2022-01-10
        • 2018-03-31
        • 2014-05-30
        • 2015-02-08
        • 1970-01-01
        相关资源
        最近更新 更多