Helm 3ライブラリチャートを書いていて、デフォルト値でYAMLを作成したいと考えています。ただし、存在しないnestedキーにデフォルト値を設定しようとすると、Helmは次のエラーメッセージで失敗します。
nil pointer evaluating interface {}
私のKubernetesオブジェクトに次のスニペットがあるとします。
{{- if eq (.Values.deployment.scale.type | default "static") "static" }}
replicas: {{ default "3" .Values.deployment.scale.replicas }}
{{- end }}
.Values.deployment.scale
が定義されている場合、テンプレートは正常にレンダリングされ、.Values.deployment.scale.replicas
が定義されていなくても、replicas
の値は3になります。
ただし、親キーの1つが定義されていない場合、Helmは上記のエラーメッセージで失敗します。たとえば、values.yaml
が次の場合:
# values.yaml
deployment:
not_scale: {}
レンダリングは失敗します:nil pointer evaluating interface {}.scale
親キーが定義されていない場合でも、ネストされたキーのデフォルト値を設定するにはどうすればよいですか?
この問題を解決するには、階層を段階的に評価し、default dict
を使用して、キーが存在しない場合に空のマップを割り当てます。それは両方とも機能し、よりよく見えます。
例:
{{ $deployment := default dict .Values.deployment }}
{{ $scale := default dict $deployment.scale }}
{{- if eq ($scale.type | default "static") "static" }}
replicas: {{ default "3" $scale.replicas }}
{{- end }}
その場合のデフォルトを設定できるとは思いません。 scale
フィールドが存在するかどうかを事前にチェックする必要があります。そのためには、 hasKey
function from sprig を使用できます。
{{- if hasKey .Values.deployment "scale" }}
{{- if eq (.Values.deployment.scale.type | default "static") "static" }}
replicas: {{ default "3" .Values.deployment.scale.replicas }}
{{- end }}
{{- else }}
replicas: 3
{{- end }}