Сбой диаграммы Helm с "нулевым указателем, оценивающим интерфейс {}" при попытке оценить отсутствующий вложенный ключ
Я пишу диаграмму библиотеки Helm 3 и хочу создать YAML со значениями по умолчанию. Однако при попытке установить значение по умолчанию для несуществующего вложенного ключа 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
определено, шаблон будет отображаться нормально, а значение replicas
будет 3, даже если .Values.deployment.scale.replicas
не определено.
Однако, если один из родительских ключей не определен, Helm выдаст сообщение об ошибке, указанное выше. Например, еслиvalues.yaml
следующее:
# values.yaml
deployment:
not_scale: {}
Рендеринг завершится ошибкой: nil pointer evaluating interface {}.scale
Как можно установить значение по умолчанию для вложенного ключа, даже если его родительские ключи не определены?
3 ответа
Я решил решить эту проблему, используя пошаговую оценку иерархии и используя 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
функция от веточки:
{{- 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 }}
В моем случае доступ к коду был заключен внутриwith ... end
блокировать. В этом случае текущий контекст больше не имеет переменной с именем.Values
. Решение состоит в том, чтобы ссылаться на глобальный объект Values с помощью$.Values
.
Из https://helm.sh/docs/chart_template_guide/variables/ :
Однако есть одна переменная, которая всегда является глобальной — $ — эта переменная всегда будет указывать на корневой контекст. Это может быть очень полезно, когда вы зацикливаетесь в диапазоне...