使用 Helm helper.tpl 从 values.yaml 或 Chart.yaml 设置存储库和映像
Using Helm helper.tpl to set repository and image from the values.yaml or Chart.yaml
我有几个不同产品的图表。在第一个中,编写了一个帮助程序来构建存储库、图像名称和 tag/version。这行得通,但由于另一个图表完全不同,我采用了一种更简单的方法,但行不通。我收到错误,
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 -}}
您在调用模板时使用了错误的参数。将 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
未定义且 returns nil
;然后 .Values.registryName
是对 nil
的查找,它会产生您看到的错误。
一个标准的解决方法是将 .
保存到 range
循环之外的一个变量,并在任何你会使用 .
的地方使用该变量。事实上,您已经这样做了,下一行中的 $root.Values.worker...
引用应该可以正常工作。您只需要在通话时更改此设置:
image: {{ template "imageName" $root }}
我有几个不同产品的图表。在第一个中,编写了一个帮助程序来构建存储库、图像名称和 tag/version。这行得通,但由于另一个图表完全不同,我采用了一种更简单的方法,但行不通。我收到错误,
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 -}}
您在调用模板时使用了错误的参数。将 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
未定义且 returns nil
;然后 .Values.registryName
是对 nil
的查找,它会产生您看到的错误。
一个标准的解决方法是将 .
保存到 range
循环之外的一个变量,并在任何你会使用 .
的地方使用该变量。事实上,您已经这样做了,下一行中的 $root.Values.worker...
引用应该可以正常工作。您只需要在通话时更改此设置:
image: {{ template "imageName" $root }}