创建命名模板并通过函数访问这些命名模板,可以很容易地从一个模板中导入另一个模板。但有时需要导入的不是模板而是文件,并注入其内容而不通过模板渲染器发送内容。
Helm 通过.Files
对象提供对文件的访问。该对象有几个注意点:
.Files
对象不能访问:1. templates/
目录下的内容,2. .helmignore
排除的文件.Files
对象时不会影响文件的可用性将三个文件添加到 chart 中,将所有三个文件直接放在 mychart/ 目录中。
config1.toml:
message = Hello from config 1
config2.toml:
message = This is config 2
config3.toml:
message = Goodbye from config 3
使用range函数来遍历它们并将它们的内容注入到ConfigMap中。
apiVersion: v1
kind: ConfigMap
metadata:
name: {{.Release.Name}}-configmap
data:
{{- $files := .Files}}
{{- range tuple "config1.toml" "config2.toml" "config3.toml"}}
{{.}}: |-
{{$files.Get .}}
{{- end}}
({{.}}: |-)
{{ $files.Get . }}
运行这个模板将产生一个包含所有三个文件内容的 ConfigMap:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: quieting-giraf-configmap
data:
config1.toml: |-
message = Hello from config 1
config2.toml: |-
message = This is config 2
config3.toml: |-
message = Goodbye from config 3
在处理文件时,对文件路径本身执行一些标准操作会非常有用。Helm 从 Go 的 path 包中导入了许多函数供使用。它们都可以使用 Go 包中的相同名称访问,但使用时小写第一个字母,例如,Base 变成 base等等。导入的功能是:
随着 chart 的增长,可能会发现需要组织更多地文件,可以使用 Files.Glob(pattern string)
方法通过具有灵活性的模式 glob patterns 协助提取文件。
.Glob
返回一个 Files 类型,所以可以调用 Files 返回对象的任何方法。
例如,目录结构如下:
foo/:
foo.txt foo.yaml
bar/:
bar.go bar.conf baz.yaml
Glob 有多个方法可选择:
{{$root := .}}
{{range $path, $bytes := .Files.Glob "**.yaml"}}
{{$path}}: |-
{{$root.Files.Get $path}}
{{end}}
# 或
{{range $path, $bytes := .Files.Glob "foo/*"}}
{{$path.base}}: '{{ $root.Files.Get $path | b64enc }}'
{{end}}
foo/:
foo.txt foo.yaml
bar/:
bar.go bar.conf baz.yaml
不存在于 2.0.2 或更早的版本中
想要将文件内容放置到 configmap 和 secret 中非常常见,以便在运行时安装到 pod 中。为了解决这个问题,Files 类型上有一些实用的方法。
为了进一步组织文件,将这些方法与 Glob 方法结合使用尤其有用。
根据上面的 Glob 示例中的目录结构:
apiVersion: v1
kind: ConfigMap
metadata:
name: conf
data:
{{- (.Files.Glob "foo/*").AsConfig | nindent 2 }}
---
apiVersion: v1
kind: Secret
metadata:
name: very-secret
type: Opaque
data:
{{(.Files.Glob "bar/*").AsSecrets | nindent 2 }}
可以导入一个文件,并使用 base64 对模板进行编码以确保成功传输:
apiVersion: v1
kind: Secret
metadata:
name: {{.Release.Name}}-secret
type: Opaque
data:
token: |-
{{.Files.Get "config1.toml" | b64enc}}
有时需要访问模板中文件的每一行。Lines 为此提供了一种方便的方法。
data:
some-file.txt: {{range .Files.Lines "foo/bar.txt"}}
{{.}}{{ end }}
目前,无法在helm install
期间将外部文件传递给 chart。因此,如果要求用户提供数据,则必须使用 helm install -f
或进行加载 helm install --set
。