helm语法{{something}}和{{-something}}之间有什么区别



我试图理解helm模板,发现语法如下:

{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}

所以我认为每件事都必须从{{-开始,但后来我发现了其他没有这种语法的语法:

- name: {{ .Chart.Name }}

所以我的问题是这两种语法之间有什么区别?仪表板做什么?什么时候需要?

Helm模板语法基于Go编程语言的文本/模板包
大括号{{}}是进入和退出模板逻辑的左括号和右括号。

Helm文档位于https://helm.sh/docs/chart_template_guide/control_structures/在一个例子中讨论了为什么需要这种语法。

YAML将意义赋予空白,因此管理空白变得非常重要。[…]可以使用特殊字符修改模板声明的大括号语法{{,以告诉模板引擎压缩空白。{{-(添加了破折号和空格(表示应该向左填充空白,而-}}表示应该消耗右边的空白。小心!换行符是空白!

所以答案是这样的{{语法和{{-语法之间的区别在于,{{- something }}将导致左侧的空格被删除。如果没有这一点,将包括任何额外的空间,这可能会导致格式错误的YAML

请参阅Helm文档,该文档详细介绍了该语法的工作原理并删除了多余的空格。

您经常会在控制结构中看到破折号,因为如果没有这些额外的空间,就会将其添加到您的YAML文件中,这可能会导致创建无效语法。例如,

{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}

使属性apiVersion输出(在YAML文件中(,而不在属性前后添加空行。

简单示例

Go模板文档显示

执行源为的模板时

"{{23 -}} < {{- 45}}"

生成的输出将是

"23<45"

这表明破折号语法会导致删除空白。

学习Helm语法实验

下面我将解释如何开始尝试helm语法使用一个简单的一次性项目。

下面的命令创建了一个临时目录testhelm并进入其中,然后运行create helm mytest来创建一个helm应用程序。

接下来,我创建一个示例helm YAML文件。这是您要放入要测试内容的文件。下面我使用了文件mytest/templates/my.yaml,但任何文件都可以创建。

Helm显然会获取templates目录中的所有文件,并对其进行解析/处理以创建YAML输出(用于创建Kubernetes YAML文件以配置K8S应用程序(。

在我们的例子中,我们只是利用helm命令创建一个测试台供我们使用。

如果您在基于UNIX的系统上,您应该能够复制并粘贴下面的整个代码示例,以创建测试床开始实验。

mkdir testhelm
cd testhelm
helm create mytest
cat <<EOF > mytest/templates/my.yaml
expression1: "{{   23    }} < {{     45    }}"
expression2: "{{   23    -}} < {{-    45    }}"
aTest0: ArgWithNoSpace
aTest1:      Arg with spaces on left and right
aTest2:      "    spaces-on-left-and-right    "
aTest3: {{ "     spaces-on-left-and-right   " }}
aTest4: {{ "     spaces-on-left-and-right   " | trim | quote }}
aTest5: Some
{{- "Thing Funky is" -}} goingOn
{{- "    here"}}
drink2: {{ .Values.drink2 | default "coffee" | quote }}
aTest6: Some    {{ "Thing Funky is"   }}goingOn    {{    "    here"}}
aTest7: Some    {{      "Thing Funky is"   }}goingOn    {{    "    here"}}
EOF

然后运行helm template命令,如下所示,并研究得到的输出。

helm template myproj ./mychart | less
. . . output trimmed . . .
# Source: mychart/templates/my.yaml
expression1: "23 < 45"
expression2: "23<45"
aTest0: ArgWithNoSpace
aTest1:      Arg with spaces on left and right
aTest2:      "    spaces-on-left-and-right    "
aTest3:      spaces-on-left-and-right
aTest4: "spaces-on-left-and-right"
aTest5: SomeThing Funky isgoingOn    here
drink2: "coffee"
aTest6: Some    Thing Funky isgoingOn        here
aTest7: Some    Thing Funky isgoingOn        here

前两个名称/值对expression1expression2显示了使用和不使用短划线语法的区别。

还要注意aTest5的语法,它导致几行合并为一行输出。

还要注意,aTest6aTest7在源中看起来不同,但产生相同的输出;CCD_ 21中的空格除非在引号内,否则不会输出。

使用这种方法可以将Helm语法消化成小块大小的块,因此当您需要修复某些内容时,您可以理解所看到的内容。

最新更新