Golang模板(helm)迭代地图列表

时间:2017-07-19 18:54:14

标签: templates go yaml kubernetes kubernetes-helm

我使用helm生成kubernetes yamls。

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

O(n^2)

... 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

Helm因此错误而失败:

{{ 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 }}

当我看到_helpers.tpl时:

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 {}

如果我在{{- define "name" -}} {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} {{- end -}} 中移除了范围循环和对$ job的引用,则_helpers.tpl jobs.yaml模板可以正常工作。当我添加循环时,它会失败。

似乎在循环内,所有包含name.范围的点.Chart管道都会被重新分配给其他人。

我做错了什么?

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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

{{ $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 }}