有以下模板代码
{{- define "test.mergedEnvVars" -}}
{{- if eq .Values.resourcesProfile "performance" }}
{{- merge .Values.perfEnvVars .Values.envVars }}
{{- else }}
{{- .Values.envVars }}
{{- end }}
{{- end }}
以及它的以下用途
{{- range $name, $value := (include "test.mergedEnvVars" .) }}
{{- if (typeIs "string" $value) }}
- name: {{ $name }}
value: {{ $value | quote }}
{{- else }}
- name: {{ $name }}
{{- toYaml $value | nindent 14 }}
{{- end }}
我收到错误消息
executing "test/templates/deployment.yaml" at <.>: range can't iterate over map[TIMEOUTS: 60 OPTIONS: -Xm200 -xS200... and so on]
变量 envVars 和 envPerfVars 只是一个映射
在 Go
text/template
语言中,define
d 模板函数总是生成字符串。 include
是一个 Helm 扩展,但它调用该函数并返回一个字符串。无法返回任何其他类型。
map[key: value]
语法是Go地图对象的默认序列化。无法将其转换回实际的地图表示形式。
简而言之:在
text/template
语言中,以及在 Helm 中的扩展,您无法编写返回映射的函数,相应地,您也无法 range (include ...)
循环遍历函数的返回值。
对于您正在使用的非常具体的情况,有一个有用的 Helm 替代方案。安装图表时,您可以使用
helm install -f
选项提供一组附加值,这些值将覆盖图表的 values.yaml
文件中的内容。
所以,假设你的图表有
# values.yaml
envVars:
- name: THREADS
value: "1"
但是如果你跑步
helm install my-application . -f performance.yaml
其中
-f
文件有
# performance.yaml
envVars:
- name: THREADS
value: "16"
那么覆盖文件中的
envVars
将优先于原始文件。
键值对列表的合并规则可能不是您所期望的(即使使用
merge
),您也可能会发现对键值进行 Helm 级别设置会更好
threads: 1
env:
- name: THREADS
value: {{ quote .Values.threads }}
而不是尝试将自由格式的 Kubernetes YAML 片段放入 Helm 设置中。