Сбой диаграммы 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/ :

Однако есть одна переменная, которая всегда является глобальной — $ — эта переменная всегда будет указывать на корневой контекст. Это может быть очень полезно, когда вы зацикливаетесь в диапазоне...

Другие вопросы по тегам