首页 > 解决方案 > Helm 模板 .Files.Get 函数在范围内无法正常工作

问题描述

我正在尝试使用文件夹和文件名通过值文件列表迭代构建动态配置映射清单。这就是我的 values.development.yaml 的样子:

templates:
  folder: "foldername"
  files:
    - filename1
    - filename2

这是我的原始配置图,带有硬编码的文件名:

apiVersion: v1
kind: ConfigMap
metadata:
  name: templates
binaryData:
  filename1: {{ .Files.Get "foldername/filename1.zip" | b64enc }}
  filename2: {{ .Files.Get "foldername/filename2.zip" | b64enc }}

这就是我尝试开始的方式,但是 .File.Get 函数不想在该范围内运行,因为我可以在外面正常使用它。当我像这样使用它时:

apiVersion: v1
kind: ConfigMap
metadata:
  name: templates
binaryData:
{{- range $.Values.templates.files }}
  {{ . }}: {{ .Files.Get "foldername/filename1.zip" | b64enc }}
{{- end }}

得到这个错误:

helm template template  -f deploy/template/values.development.yaml  deploy/template --debug         
install.go:173: [debug] Original chart version: ""
install.go:190: [debug] CHART PATH: 
Error: template: template/templates/configmap.yaml:14:20: executing "template/templates/configmap.yaml" at <.Files.Get>: can't evaluate field Files in type interface {}
helm.go:81: [debug] template: template/templates/configmap.yaml:14:20: executing "template/templates/configmap.yaml" at <.Files.Get>: can't evaluate field Files in type interface {}

不用说,我对 Go 语言了解不多。你能给我一些关于如何正确构建该列表的提示吗?谢谢!

标签: kubernetes-helmgo-templates

解决方案


在 Gotext/template语言中,.是一个具有多种含义的特殊变量。值得注意的是,在循环内部range.成为循环中的当前项,因此.Files指的Files是当前循环项中的字段,而不是顶级 Helm 对​​象。

您可以通过保存.或保存.Files到循环外的局部变量中来解决此问题:

binaryData:
{{- $files := .Files }}
{{- range $.Values.templates.files }}
  {{ . }}: {{ $files.Get "foldername/filename1.zip" | b64enc }}
{{- end }}

现在循环内部是来自数组.的字符串filename1, filename2, ... files但是您已将顶级.Files对象保存到$files局部变量中,因此您可以参考它。


推荐阅读