我正在开发 Helm 图表并尝试创建通用模板函数。目标是传入任何参数(例如 .Values.name)并在不知道参数的具体情况的情况下使用函数模板。
该函数应接受类似 .Values.name 的参数。
如果满足特定条件(例如.Values.enableTpl),它应该使用 tpl 评估参数。
该函数应该处理各种类型,例如字符串和列表。
{{- define "function" -}}
{{- $value := . -}} <-- this should pick up the parameter
{{- if .Values.enableTpl }}
{{ tpl $value $ }}
{{- else }}
{{ $value }}
{{- end }}
{{- end }}
# Usage in template
{{ include "function" .Values.name }} <-- function should not know about this parameter
尝试此操作时,我在尝试检查enableTpl条件时遇到错误:“无法评估字符串类型中的字段值”。 删除 enableTpl 检查也会失败,因为 .不是实际参数“.Values.name”
请注意,这是我的问题的抽象,所以请不要质疑不只是在没有包含的情况下这样做的原因:)
Helm 语法有点棘手。 Go 模板函数仅采用单个参数,并且在该函数中,
.
和 $
的默认值都设置为该参数。
这意味着,如果您既需要某些值又需要顶级 Helm 对象,则需要将它们打包到一个对象中。 我曾经通过将两个对象放入列表中来完成此操作
{{ include "function" (list .Values.name .) }}
然后在函数中解压它们。
{{- define "function" -}}
{{- $value := index . 0 -}}
{{- $top := index . 1 -}}
{{- if $top.Values.enableTpl -}}
{{- tpl $value $top -}}
...
请注意,我们已将顶级 Helm 对象显式作为参数传递;将其解压到函数内的
$top
;然后在任何我们需要一个字段的地方,将其限定为访问 $top
。
您还可以将两个“参数”作为映射传递
dict "value" .Values.name "top" .
。 如果这样做,则无需在函数中解压它们,可以直接引用 e.g. .top.Values.enableTpl
或 tpl .value .top
。 这将一些复杂性从函数推给了调用者。 这两种模式都不常见,但我都见过。