假设我正在创建一个helm模板,我希望最终部署能够按照自己的意愿执行命令。对于本例,我将使用usetouch
命令。
在我的模板文件中,我会这样写:
templates.yaml
...
foo:
{{- if .Values.foo.command }}
exec:
command: {{ .Values.foo.command }}
{{- end }}
...
然后,我有我的值文件:
values.yaml
...
foo:
command: ["touch", "bar.txt"]
...
当我检查上面的结果模板时,命令被模板化为:
foo:
exec:
command: [touch bar.txt]
因此,它的命令中没有引号/逗号。这仍然会按预期执行吗?还是需要逗号和引号来执行?
谢谢!
这不会像预期的那样工作。您显示的输出语法是一个有效的YAML列表,但只包含一个shell单词,因此它正在查找一个名为touch bar.txt
的命令,其中的空格将是/usr/bin
中文件名的一部分。
Helm使用的Go文本/模板引擎并不特别了解YAML。当您直接写出这样的值时,它使用的默认格式并不是特别有用。Helm有几个文档较少的扩展,可以用更有用的格式输出值。对于您的示例,我可能会使用:
foo:
{{- with .Values.foo.command }}{{/* like "if", but also rebinds `.` */}}
exec:
command:
{{ toYaml . | indent 6 }}
{{- end }}
应该这样写:
foo:
exec:
command:
- touch
- bar.txt
###### note: 6 spaces here matches `indent 6`
您可以将command: {{ toJson .Values.foo.command }}
放入一行中。在任何一种情况下,它都可能没有values.yaml
文件中的确切格式,因为Helm在启动时解析YAML,然后写出等效的结构。