1. with 修改范围
下一个要看的控制结构是 with
。它控制着变量作用域。回想一下,.
是对当前范围的引用。因此,.Values
告诉模板在当前范围中查找 Values
对象。
其语法 with 类似于一个简单的 if 语句:
{{ with PIPELINE }}
# restricted scope
{{ end }}
范围可以改变。with 可以允许将当前范围(.
)设置为特定的对象。例如,我们一直在使用的 .Values.favorites
。让我们重写我们的 ConfigMap 来改变 .
范围来指向 .Values.favorites
:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}
food: {{ .food | upper | quote }}
{{- end }}
注意,现在我们可以引用 .drink
和 .food
无需对其进行限定。这是因为该 with
声明设置 .
为指向 .Values.favorite
。在 {{ end }}
后 .
复位其先前的范围。
但是请注意!在受限范围内,此时将无法从父范围访问其他对象。例如,下面会报错:
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}
food: {{ .food | upper | quote }}
release: {{ .Release.Name }}
{{- end }}
它会产生一个错误,因为 Release.Name 它不在 .
限制范围内。但是,如果我们交换最后两行,所有将按预期工作,因为范围在 {{ end }}
之后被重置。
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}
food: {{ .food | upper | quote }}
{{- end }}
release: {{ .Release.Name }}
看下 range
,我们看看模板变量,它提供了一个解决上述范围问题的方法。
[!TIP|style:flat] 在
with
中访问.Release
、.Chart
以及include
模板时,可以通过$
来访问变量,详情访问 变量