我有几张不同产品的图表。在第一个版本中,编写了一个帮助程序来构建回购、图像名称和标记/版本。这是可行的,但由于另一个图表是完全不同的,我经历了一个更简单的方法,但它不起作用。我知道错误了,
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 -}}
发布于 2022-04-04 13:38:01
使用错误的参数调用模板。将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 }}
https://stackoverflow.com/questions/71695632
复制相似问题