使用 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
。
在您的代码中,变量
$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 }}