当变量子键不存在时,Helm 回退到默认的下一个变量

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

使用 Helm v3,以下模板因错误而中断:

Error: INSTALLATION FAILED: template: rabbitmq/templates/secrets.yaml:4:31: executing "rabbitmq/templates/secrets.yaml" at <.Values.global.rabbitmq.password>: nil pointer evaluating interface {}.rabbitmq

rabbitmq/templates/secrets.yaml
的内容:

{{- $def := index .Values "default" -}}
apiVersion: v1
data:
  rabbitmq-password: {{ $def.global.rabbitmq.password | default $def.RABBITMQ_PASSWORD | b64enc | quote }}
  rabbitmq-erlang-cookie: {{ randAlphaNum 20 | b64enc | quote }}
kind: Secret
metadata:
  name: rabbitmq-password
type: Opaque

.Values.global.{}
存在时,此功能有效。 但是,当
.Values.global
不存在时,它不会像我预期的那样回退到
$def.RABBITMQ_PASSWORD

kubernetes-helm
1个回答
1
投票

在您的代码中,变量

$def
始终为
.Values.default
(即,
default:
文件中顶级键
values.yaml
下的任何内容)。 这可能不是你想要的。

我在这里发现成功的模式是为层次结构的每个级别设置一个变量,如果不存在则将其默认为空字典。 这将让你进行递归查找。

我猜,当您说

$def.global
时,您实际上指的是顶级
.Values.global
对象,它在 Helm 子图上下文中具有特殊含义。 所以你可以安全地进行这些查找,例如:

{{- $def := .Values.default | default dict }}
{{- $global := .Values.global | default dict }}
{{- $rabbitmq := $global.rabbitmq | default dict }}
rabbitmq-password: {{ $rabbitmq.password | default $def.RABBITMQ_PASSWORD | b64enc | quote }}
© www.soinside.com 2019 - 2024. All rights reserved.