Отрендерите значение чарта со значением по умолчанию в Helm-шаблоне
Шаблон Deployment берёт тег образа из .Values.image.tag, но чарт обязан рендериться и тогда, когда пользователь это значение не задал — тогда нужно откатиться к собственному appVersion чарта. Впишите выражение шаблона так, чтобы тег был значением пользователя, когда оно задано, и .Chart.AppVersion иначе.
Ограничение: не хардкодьте тег, и чарт должен ставиться без единого override.
# templates/deployment.yaml
spec:
template:
spec:
containers:
- name: app
image: "myrepo/app:{{ /* TODO: значение с дефолтом */ }}"
Допишите выражение шаблона.
Используйте функцию Helm default: {{ .Values.image.tag | default .Chart.AppVersion }}. Она подставляет .Values.image.tag, когда он задан, и откатывается к appVersion чарта, если он пуст или не задан. Чарт ставится без единого override, но пользователь всё ещё может закрепить тег.
- ✗Подавать аргументы в
defaultв неверном порядке, переворачивая приоритет - ✗Использовать
required, который обрывает рендер, а не откатывается к дефолту - ✗Считать, что в Go-шаблонах есть тернарник
?:для значения по умолчанию
- →Как, наоборот, сделать значение обязательным, чтобы рендер падал, если оно не задано?
- →Что вернёт
default, когда.Values.image.tag— пустая строка против nil?
Решение
default в Helm возвращает второй аргумент (запасной), когда левый вход пуст или не задан. Порядок важен — слева идёт предпочтительное значение пользователя, справа — дефолт:
# templates/deployment.yaml
spec:
template:
spec:
containers:
- name: app
image: "myrepo/app:{{ .Values.image.tag | default .Chart.AppVersion }}"
Так при helm install без override тег берётся из Chart.yaml (appVersion), а пользователь может закрепить свой тег через --set image.tag=... или values.yaml. Не используйте required (он обрывает рендер) и не изобретайте тернарник — в Go-шаблонах его нет.