【问题标题】:Golang template (helm) iterating over a list of maps遍历地图列表的 Golang 模板(helm)
【发布时间】:2017-12-25 05:09:33
【问题描述】:

我正在使用 helm 生成 kubernetes yaml。

我的 values.yaml 看起来像这样:

...
jobs:
  - nme: job1
    command: [sh, -c, "/app/deployment/start.sh job1"]
    activeDeadlineSeconds: 600
  - name: job2
    command: [sh, -c, "/app/deployment/start.sh job2"]
    activeDeadlineSeconds: 600
...

templates/jobs.yaml

{{ range $i, $job := .Values.jobs -}}
apiVersion: batch/v1
kind: Job
metadata:
  name: {{ template "name" . }}-{{ $job.name }}
  labels:
    chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
spec:
  activeDeadlineSeconds: {{ $job.activeDeadlineSeconds }}
  template:
    metadata:
      labels:
        app: {{ template "name" . }}-{{ $job.name }}
    spec:
      containers:
      - name: {{ .Chart.Name }}
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        imagePullPolicy: {{ .Values.image.pullPolicy }}
        command: {{ $job.command }}
        env:
{{ toYaml .Values.service.env | indent 10 }}
        ports:
        - containerPort: {{ .Values.service.internalPort }}
{{- end }}

Helm 因此错误而失败:

Error: UPGRADE FAILED: render error in "app1/templates/jobs.yaml": template: app1/templates/_helpers.tpl:6:18: executing "name" at <.Chart.Name>: can't evaluate field Name in type interface {}

当我查看 _helpers.tpl 时:

{{- define "name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
{{- end -}}

如果我删除jobs.yaml 中的范围循环和对$job 的引用,_helpers.tpl name 模板可以正常工作。当我在循环中添加时,它失败了。

似乎在循环中,包含.Chart.Values 范围的所有点. 管道都被重新分配给其他东西。

我做错了什么?

【问题讨论】:

    标签: templates go yaml kubernetes kubernetes-helm


    【解决方案1】:

    在循环内部,. 的值设置为当前元素,您必须使用 $.Chart.Name 来访问您的数据。

    我问了一个类似的问题,我认为答案https://stackoverflow.com/a/44734585/8131948 也会回答你的问题。

    【讨论】:

      【解决方案2】:

      我最终保存了全局上下文,然后像这样更新我的所有引用:

      {{ $global := . }}
      {{ range $i, $job := .Values.jobs -}}
      apiVersion: batch/v1
      kind: Job
      metadata:
          name: {{ template "name" $global }}-{{ $job.name }}
          labels:
          chart: "{{ $global.Chart.Name }}-{{ $global.Chart.Version | replace "+" "_" }}"
      spec:
          activeDeadlineSeconds: {{ $job.activeDeadlineSeconds }}
          template:
          metadata:
              labels:
              app: {{ template "name" $global }}-{{ $job.name }}
          spec:
              containers:
              - name: {{ $global.Chart.Name }}
              image: "{{ $global.Values.image.repository }}:{{ $global.Values.image.tag }}"
              imagePullPolicy: {{ $global.Values.image.pullPolicy }}
              command: {{ $job.command }}
              env:
      {{ toYaml $global.Values.service.env | indent 10 }}
              ports:
              - containerPort: {{ $global.Values.service.internalPort }}
      {{- end }}
      

      【讨论】:

      • $. 不是用来访问全局范围的吗?例如。 $.Chart.Name$.Values.image.tag。见Helm Docs
      • 我投了反对票,因为最佳答案是正确的,并且可以节省您编写比要求更多的代码 :)
      猜你喜欢
      • 1970-01-01
      • 2011-12-22
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2010-10-21
      • 2020-05-18
      相关资源
      最近更新 更多