Helm 中 $.Values 和 .Values 之间的区别

Sat*_*mar 3 go-templates kubernetes-helm

我了解 Helm 图表中的用法.Values.varName,它用于引用Values.yaml文件中的变量

我想知道$.Values.varName和之间的区别.Values.varName

例如,当我设置name: $.Values.varNamename: .Values.varName

Dav*_*aze 7

与许多其他语言一样,Go文本/模板.语言中有一个字段访问运算符。在该表达式的更明显的后半部分中,.Values.varName查找varName值对象中的字段(对象字段或映射成员)。

Helm 有一个标准的顶级对象,其中包含多个字段,包括Values. 因此,这两个表达式通常从顶级对象开始,在其中查找,然后在其中Values查找。varName

text/template语言中,.也是一个变量。当您评估顶级templates/*.yaml文件时,.是顶级 Helm 对​​象,但在define函数内部,它是模板的单个参数,在range循环内部,它是当前循环项,依此类推。在“是什么”和“什么用例”中带有点“.”。在舵图中?我列出更多案例。

最后$也是一个变量。例如,在range循环的上下文中,$即使发生更改,也会保留顶级值.$始终是顶级 Helm 值。

产生差异的地方是在循环range或其他重新绑定的上下文中.。在这种情况下,您需要$.Values引用顶级对象。


举个例子,假设values.yaml包含

varName: foo
someNumbers:
  - one
  - two
  - three
Run Code Online (Sandbox Code Playgroud)

然后在这个模板文件中:

apiVersion: v1
kind: ConfigMap
metadata:
  annotations:
    # in the top level template so these are the same
    value-is-foo: {{ .Values.varName }}
    value-is-also-foo: {{ $.Values.varName }}
data:
{{- range .Values.someNumbers }}
  # now $ is the top-level object, but . is "one", "two", "three"
  {{ . }}: one, two, or three
  {{ $.Values.varName }}-{{ . }}: foo-one, foo-two, foo-three
  {{ .Values.varName }}: |-
    an error, since the string "one" doesn't have a field or
    member "Values"
{{- end }}
Run Code Online (Sandbox Code Playgroud)