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.
The tpl function allows developers to evaluate strings as templates inside a template. This is useful to pass a template string as a value to a chart or render external configuration files.
With Helm's helm template command, you can check the output of the chart in fully rendered Kubernetes resource templates. This is a very handy command to check the templates' outputs, especially when you are developing a new chart, making changes to the chart, debugging, and so on.
Synopsis. This command takes a path to a chart and runs a series of tests to verify that the chart is well-formed. If the linter encounters things that will cause the chart to fail installation, it will emit [ERROR] messages.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With