我正在使用 Helm 图表来控制为部署中的某个容器设置的环境变量。
在我的Values.yaml
中,我有一个名为env
的条目,它是一个字典:
image:
repository: xxxx.yyyyy.com/myimage
pullPolicy: IfNotPresent
# Enviroment variables that will be passed to the container.
env: {}
现在,我将使用--set
将变量传递给env
字典:
helm upgrade mydeployment chart --set env.VARIABLE=test
但是,这必须转换为一个列表以遵守 Kubernetes yaml:
spec:
template:
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
# This should come from that dict
env:
- name: VARIABLE
value: "test"
我不知道如何使用 Helm 的模板语言(sprig/go)来实现这一点。甚至可能吗?
为了遍历地图,核心 Go 文本/模板语言提供了一个可以遍历地图或数组的range
关键字。
{{ range $key, $value := .Values.env }}
...
{{ end }}
在其中,您可以放置任意文本。 Helm 不要求这是任何特定类型的 YAML 构造,只要最终结果是有效的 YAML 即可。 对于此设置,典型的循环如下所示
env:
{{- range $key, $value := .Values.env }}
- name: {{ quote $key }}
value: {{ quote $value }}
{{- end }}
您确实需要注意此处的缩进。 根据经验,通常在打开{{
内包含一个-
"吞下空白"指示器,而在收盘}}
内不包含一个指示器。- name:
必须至少与其上方的env:
一样缩进(忽略range
行),并且value:
必须与name:
对齐。 我可能会将所有模板语言行(range
和end
)从第一列开始,即使它们嵌入在嵌套更多的结构中。
spec:
template:
spec:
containers:
- name: {{ template "chart.fullname" . }}
env:
{{- range $key, $value := .Values.env }}
- name: {{ quote $key }}
value: {{ quote $value }}
{{- end }}
image: {{ .Values.registry }}/{{ .Values.image }}:{{ .Values.tag }}