在 Go 模板中使用 include inside range (helm)

zna*_*nat 11 go-templates kubernetes-helm

我有一个通过range迭代渲染多次的模板,我可以$.Release.Name毫无问题地访问变量外部变量。但是,当我包含模板时,我无法让它工作:

{{ range $key, $val := $.Values.resources }}
      ...
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "/secrets.yaml") . | sha256sum }}
{{ end }}
Run Code Online (Sandbox Code Playgroud)

并在secrets.yaml

apiVersion: "v1"
kind: "Secret"
metadata:
  name: {{ $.Release.Name }}-secrets
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Error: render error in "botfront-project/templates/deployment.yaml": template: [filename] :19:28: executing [filename] at <include (print $.Template.BasePath "/secrets.yaml") .>: error calling include: template: .../secrets.yaml:4:19: executing ".../secrets.yaml" at <$.Release.Name>: nil pointer evaluating interface {}.Name

Run Code Online (Sandbox Code Playgroud)

如何访问包含模板中的变量?

Fra*_*ois 20

TL; 博士;

只需更换.$使用在全球范围内,而不是你创建的本地之一。

例子:

{{- include "my-chart.labels" $ | nindent 4 }}
Run Code Online (Sandbox Code Playgroud)

说明

根据文档,https : //helm.sh/docs/chart_template_guide/control_structures/#modifying-scope-using-with

我们可以使用 $ 从父作用域访问对象 Release.Name。$ 在模板执行开始时被映射到根作用域,并且在模板执行期间它不会改变

随着range我们改变循环内的范围。确实,{{- include "my-chart.labels" . | nindent 4 }}会调用当前范围.

所以如果你在 helm doc 中深入研究这个“范围”的东西,你最终会发现这部分:https : //helm.sh/docs/chart_template_guide/variables/

通过这个例子:

{{- range .Values.tlsSecrets }}
apiVersion: v1
kind: Secret
metadata:
  name: {{ .name }}
  labels:
    # Many helm templates would use `.` below, but that will not work,
    # however `$` will work here
    app.kubernetes.io/name: {{ template "fullname" $ }}
    # I cannot reference .Chart.Name, but I can do $.Chart.Name
    helm.sh/chart: "{{ $.Chart.Name }}-{{ $.Chart.Version }}"
    app.kubernetes.io/instance: "{{ $.Release.Name }}"
    # Value from appVersion in Chart.yaml
    app.kubernetes.io/version: "{{ $.Chart.AppVersion }}"
    app.kubernetes.io/managed-by: "{{ $.Release.Service }}"
type: kubernetes.io/tls
data:
  tls.crt: {{ .certificate }}
  tls.key: {{ .key }}
---
{{- end }}
Run Code Online (Sandbox Code Playgroud)

  • 这是有效的。我对你感激不尽,先生。 (3认同)