Helm Range 无法迭代地图

问题描述 投票:0回答:1

有以下模板代码

{{- 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 只是一个映射

kubernetes kubernetes-helm
1个回答
0
投票

在 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 设置中。

© www.soinside.com 2019 - 2024. All rights reserved.