ingress.yaml template returns error in renderring --> nil pointer evaluating interface {}.service
Asked Answered
E

3

41

I am installing a helm chart which has a ingress.yaml template.

I get this error:

Error: render error in "chartmuseum/templates/ingress.yaml": template: chartmuseum/templates/ingress.yaml:35:22: executing "chartmuseum/templates/ingress.yaml" at <.Values.service.servicename>: nil pointer evaluating interface {}.service

I am not able to find where the problem is. The same set of if else structure works abolutely fine in the service.yaml of the same helm chart.

- path: {{ default "/" .path | quote }}
        backend:
        {{- if .Values.service.servicename }}
          serviceName: {{ .Values.service.servicename }}
        {{- else }}
          serviceName: {{ include "chartmuseum.fullname" . }}
        {{- end }}

Getting error on this line --> serviceName: {{ .Values.service.servicename }}

The code that works in service.yaml fine is

metadata:
{{- if .Values.service.servicename }}
  name: {{ .Values.service.servicename }}
{{- else }}
  name: {{ include "chartmuseum.fullname" . }}
{{- end }}

Expected result: if there is a servcice.servicename in values in values.yaml file , the ingress should pick the value from there for the key serviceName. Else it should include "chartmuseum.fullname".

The same structure works fine for service.yaml.

Below is the url of the original helm chart that i am using.

https://github.com/helm/charts/tree/master/stable/chartmuseum

I just modified the ingress.yaml to add if else block around line 31. Ingress.yaml https://github.com/helm/charts/blob/master/stable/chartmuseum/templates/ingress.yaml

Values.yaml file is insignificant. I have the below values in it

service:
  servicename: helm-charts-test

but even without this value, the if else block is expected to work.

Excurved answered 13/8, 2019 at 10:6 Comment(0)
R
84

What you're seeing is a weird caveat in Go templating. Your conditional logic is being evaluated inside a range loop. This means . you're using to access Values is not the one you expect it to be, as it's overridden for each range iteration evaluation. You can use $, which references the global scope in order to access the Values as expected.

For your scenario, it would be something like:

- path: {{ default "/" .path | quote }}
        backend:
        {{- if $.Values.service.servicename }}
          serviceName: {{ $.Values.service.servicename }}
        {{- else }}
          serviceName: {{ include "chartmuseum.fullname" $ }}
        {{- end }}

See here for more details.

Recombination answered 13/8, 2019 at 13:55 Comment(8)
Thanks for the answer. It solves the error in concern. But now it gives an error on the else part. Error: render error in "chartmuseum/templates/ingress.yaml": template: chartmuseum/templates/ingress.yaml:38:26: executing "chartmuseum/templates/ingress.yaml" at <include "chartmuseum.fullname" .>: error calling include: template: chartmuseum/templates/_helpers.tpl:50:37: executing "chartmuseum.fullname" at <.Values.global>: nil pointer evaluating interface {}.globalExcurved
seems like cant use {{ include "chartmuseum.fullname" . }} inside the range. Any workaround ?Excurved
how do i use $ with include {{ include "chartmuseum.fullname" . }} ? Although i have managed to run it fine by replacing the else part with {{ default $serviceName .service }} and defining the variable $servicename at the beginning {{- $serviceName := include "chartmuseum.fullname" . -}}Excurved
What you did is definitely an option here. You could also save the global context out of the control structure in order to make your solution more generic. See here.Recombination
I've also updated the answer to be complete the example.Recombination
@yanivoliver thank you so much!!!!!! you made my day!!!! תודה רבה!!!!Trulatrull
May the invisible space wizard bless your imaginary imortal being.Cinelli
the "see here for more details" like is broken - this one should help. helm.sh/docs/chart_template_guide/variablesIlana
R
15

I followed this answer by @Torrey and replaced

targetPort: {{ .Values.non_existing.port | default 1234 }}

with

targetPort: {{ (.Values.non_existing).port | default 1234 }}

and it worked

Roca answered 19/9, 2022 at 13:5 Comment(1)
Awesome solution, thank you!Limes
K
0

I have faced same issue. Try checking by linking values.yaml. If it returns no errors, then there is no issue with indentations. Then check if the values.yaml file name; if v is V or v is small v. It worked for me after changing the name of file from Values.yaml to values.yaml.

helm lint -f C:\\Users\\pasup\\Documents\\narasimhachart\\values.yaml C:\\Users\\pasup\\Documents\\narasimhachart
Kylynn answered 2/6, 2024 at 12:20 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.