У меня есть несколько таблиц для разных продуктов. В первом был написан помощник для создания репозитория, имени изображения и тега/версии. Это работает, но поскольку другая диаграмма совершенно другая, я использовал более простой подход, но он не работает. Я получаю ошибку,
error calling include: template: MYChart/templates/_helpers.tpl:94:28: executing "getImageName" at <.Values.registryName>: nil pointer evaluating interface {}.registryName
Это помощник.
{{/*
This allows us to not have image: .Values.xxxx.ssss/.Values.xxx.xxx:.Values.ssss
in every single template.
*/}}
{{- define "imageName" -}}
{{- $registryName := .Values.registryName -}}
{{- $imageName := .Values.imageName -}}
{{- $tag := .Chart.AppVersion -}}
{{- printf "%s/%s:%s" $registryName $imageName $tag -}}
{{- end -}}
Это значения
registry:
registryName: "index.docker.io/myrepo"
image_Name: "myimage"
Вызов значения, подобного приведенному выше, в _helper.tpl должен работать, существует множество примеров, использующих этот подход. Что мне не хватает?
Файл шаблона:
{{- $root := . -}}
{{- $FullChartName := include "myapp.fullname" . -}}
{{- $ChartName := include "myapp.name" . -}}
{{- range $worker, $parameter := .Values.workerPods }}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ $parameter.name }}-worker
spec:
replicas: {{ $parameter.replicas }}
selector:
matchLabels:
app.kubernetes.io/name: {{ $parameter.name }}-worker
app.kubernetes.io/instance: {{ $root.Release.Name }}
template:
metadata:
labels:
app.kubernetes.io/name: {{ $parameter.name }}-worker
app.kubernetes.io/instance: {{ $root.Release.Name }}
autoscale: "true"
annotations:
{{- if $root.Values.worker.annotations }}
{{ toYaml $root.Values.worker.annotations | indent 8 }}
{{- end }}
spec:
imagePullSecrets:
- name: myapp-registry-credentials
containers:
- name: {{ $parameter.name }}-worker
image: {{ template "imageName" . }}
imagePullPolicy: {{ $root.Values.worker.image.pullPolicy }}
command: ["/bin/sh"]
args: ["-c", "until /usr/bin/pg_isready -h $DATABASE_HOST; do sleep 2; done; bundle exec rake jobs:work"]
{{- range $container, $containerResources := $root.Values.containers }}
{{- if eq $container $parameter.size }}
resources:
{{- toYaml $containerResources.resources | nindent 12 }}
{{- end }}
{{- end }}
envFrom:
- configMapRef:
name: common-env
- secretRef:
name: myapp-secrets
volumeMounts:
- name: mnt-data
mountPath: "/mnt/data"
volumes:
- name: mnt-data
persistentVolumeClaim:
claimName: myapp-pvc
{{- with $root.Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with $root.Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with $root.Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- end }}
Я также попробовал этот подход и добавил следующее в Chart.yaml
, но получил аналогичную ошибку, я буду честен и не был уверен, что это вообще сработает, но было бы интересно услышать мысли других.
annotations:
image: "myimage"
registry: "index.docker.io/myrepo"
А помощник выглядел вот так.
{{/*
This allows us to not have image: .Values.xxxx.ssss/.Values.xxx.xxx:.Values.ssss
in every single template.
*/}}
{{- define "imageName" -}}
{{- $registryName := .Chart.Annotations.registry -}}
{{- $imageName := .Chart.Annotations.image -}}
{{- $tag := .Chart.AppVersion -}}
{{- printf "%s/%s:%s" $registryName $imageName $tag -}}
{{- end -}}
image: {{ template "imageName" . }}
Да, я правильно указал его в шаблоне.
Возможно, это внутри блока with
или range
(что изменит значение .
)? Можете ли вы отредактировать вопрос, включив в него достаточно шаблона, делающего звонок, чтобы продемонстрировать проблему?
@DavidMaze да, это так. Я добавил шаблон, как просили.
Вы вызываете шаблон с неправильным параметром. Сокращение файла шаблона Helm до минимума, чтобы продемонстрировать это:
{{- $root := . -}}
{{- range $worker, $parameter := .Values.workerPods }}
image: {{ template "imageName" . }}
imagePullPolicy: {{ $root.Values.worker.image.pullPolicy }}
{{- end }}
Стандартный оператор Go text/template
range
перепривязывает переменную .
(я думаю, что то же самое, что и $parameter
). Итак, когда вы вызываете шаблон imageName
, его параметром является не корневое значение Helm, а блок из файла значений; .Values
не определено и возвращает nil
; а затем .Values.registryName
ищет nil
, что приводит к ошибке, которую вы видите.
Один из стандартных обходных путей — сохранить .
в переменной вне цикла range
и использовать эту переменную везде, где вы бы использовали .
. И на самом деле вы уже делаете это, ссылка $root.Values.worker...
в следующей строке должна работать правильно. Вам просто нужно изменить это в точке вызова:
image: {{ template "imageName" $root }}
Дэвид, я должен тебе пиво, но так как это, вероятно, невозможно, моя благодарность будет достаточной. Теперь это имеет смысл, хотя я думаю, что мне нужно прочитать еще немного, когда у меня будет такая возможность. Огромное спасибо за помощь.
Как вы называете шаблон оболочки
imageName
; Вы не забыли передать его.
в качестве параметра, и это в каком-то контексте, который бы перепривязывал.
? (Похоже, этот шаблон ничем не отличается от прямого вызоваgetImageName
. Также убедитесь, что.Values.registry.image_Name
соответствует структуре файлаvalues.yaml
, хотя это не вызовет конкретной ошибки, которую вы видите здесь.)