Helm 图表在尝试评估缺失的嵌套键时失败,并显示“nil 指针评估接口 {}”

问题描述 投票:0回答:3

我正在编写一个 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
,即使未定义
replicas
,模板也将渲染良好,并且
.Values.deployment.scale.replicas
的值将为3。

但是,如果未定义父键之一,Helm 将失败并显示上述错误消息。例如,如果

values.yaml
如下:

# values.yaml
deployment:
  not_scale: {}

渲染将失败并显示:

nil pointer evaluating interface {}.scale

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

go kubernetes-helm sprig-template-functions
3个回答
5
投票

我不认为,你可以为这种情况设置默认值。您需要预先检查

scale
字段是否存在。为此,您可以使用 sprig 中的
hasKey
函数:

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

0
投票

在我的例子中,访问

.Values
的代码被包装在
with ... end
块内。在这种情况下,当前上下文不再有名为
.Values
的变量。解决方案是使用
$.Values
引用全局 Values 对象。

来自 https://helm.sh/docs/chart_template_guide/variables/ :

但是,有一个变量始终是全局的 - $ - 该变量将始终指向根上下文。当您在某个范围内循环时,这非常有用......

© www.soinside.com 2019 - 2024. All rights reserved.