假如我们在values.yaml中的app路径下定义了多个参数,在相应的template中调用时需要重复声明多个.Values.app根路径:

with 操作可以解决这个问题——它用于控制变量的作用域,然后重新用 . 调用就表示对当前作用域的引用。例如,我们一直在使用 .Values.app,让我们重写下configmap.yaml模板文件来更改 . 的范围指向 .Values.app:

使用with block时,还有一个问题需要特别注意,由于with作用域此时为.Values.app, 如果我们在里面继续调用其他的全局变量(如.Release.Name),则调用路径实际为.Values.app.Release.Name,不符合预期,进行渲染时也会报错。
可以使用$符号来解决这个问题,它表示重新从根路径开始搜索:

configmap.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-appinfo
data:
{{- with .Values.app }}
{{- with .ui }}
background: {{ .bg }}
foreground: {{ .fg }}
{{- end }}
{{- with .db }}
database: {{ .name }}
connection: {{ .conn }}
{{- end }}
release: {{ $.Release.Name }}
{{- end }}
values.yaml:
app:
ui:
bg: red
fg: black
db:
name: "users"
conn: "mongodb://localhost:27020/mydb"
执行结果:
