安装舵图时无指针评估接口

问题描述 投票:0回答:3

我正在尝试将图表安装到我的集群,但出现错误

Error: template: go-api/templates/deployment.yaml:18:24: executing "go-api/templates/deployment.yaml" 
at <.Values.deployment.container.name>: nil pointer evaluating interface {}.name

但是我对另外 2 个图表执行了相同的命令,效果很好。

我使用的模板文件是这样的:

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: {{ .Values.namespace}}
  labels: {{- include "chart.labels" . | nindent 4 }}
  name: {{ .Values.deployment.name}}
spec:
  replicas: {{ .Values.deployment.replicas}}
  selector:
    matchLabels: {{ include "chart.matchLabels" . | nindent 6 }}
  template:
    metadata:
      labels: 
        app.kubernetes.io/name: {{ template "chart.name" . }}
        app.kubernetes.io/instance: {{ .Release.Name }}
    spec:
      containers:
      - name: {{ .Values.deployment.container.name }}
        image: {{ .Values.deployment.container.image }}
        imagePullPolicy: Never
        ports:
          - containerPort: {{ .Values.deployment.container.port }}

kubernetes kubernetes-helm
3个回答
10
投票

如果您用于安装的 Helm 值没有该特定块,则可能会发生这种情况:

namespace: default
deployment:
  name: a-name
  replicas: 1
  # but no container:

为了避免模板代码中的这种特定错误,将父字典挑选到变量中是有用的;然后,如果父母完全不在,你可以决定该怎么做。如果有可选字段或合理的默认值,此技术会更有用:

{{- $deployment := .Values.deployment | default dict }}
metadata:
  name: {{ $deployment.name | default (include "chart.fullname" .) }}
spec:
{{- if $deployment.replicas }}
  replicas: {{ $deployment.replicas }}
{{- end }}

如果您确实无法在没有该值的情况下工作,Helm 有一个未记录的

required
函数,可以打印更具体的错误消息。

{{- $deployment := .Values.deployment | required "deployment configuration is required" }}

(我的经验是,作为最终用户,

required
值有些令人沮丧,特别是当您尝试运行其他人的图表时,如果可能的话,我会尽力避免这种情况。)

鉴于您所显示的内容,您也有可能使图表可配置。例如,容器名称主要是一个只有在您拥有多容器 pod(或正在使用 Istio)时才会出现的详细信息;容器端口是您正在运行的映像的固定属性。您可以安全地在 Helm 模板文件中修复这些值,然后为副本计数或映像名称等提供默认值是合理的(考虑将存储库名称、映像名称和标记设置为单独的变量)。

{{- $deployment := .Values.deployment | default dict }}
{{- $registry := $deployment.registry | default "docker.io" }}
{{- $image := $deployment.image | default "my/image" }}
{{- $tag := $deployment.tag | default "latest" }}
containers:
  - name: app # fixed
    image: {{ printf "%s/%s:%s" $registry $image $tag }}
{{- with .Values.imagePullPolicy }}
    imagePullPolicy: {{ . }}
{{- end }}
    ports:
      - name: http
        containerPort: 3000 # fixed

10
投票

如果该值是在您的值文件中定义的,并且您仍然收到错误,则问题可能是由于在

range
或类似函数中访问该值而更改了上下文。

例如,要使用已通过

mySuffix
定义的命名模板
.Values
并在
range
内部使用
template
函数,我们需要向
$
函数提供
template
,而不是通常的函数
.

{{- define "mySuffix" -}}
{{- .Values.suffix }}
{{- end }}
...
{{- range .Values.listOfValues }}
  echo {{ template "mySuffix" $ }}
{{- end }}

0
投票

检查您的 Values.yaml 文件名是否太大?并确保描述值时没有太多字符。这解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.