У этого вопроса есть два уровня.
Docker
Если вы используете что-то вроде FROM baseimage:latest
, это точное изображение будет сброшено при вашей первой сборке. Docker кэширует слои при последовательных сборках, поэтому он не только будет собирать из одного и того же baseimage:latest
, но также будет пропускать выполнение элементов Dockerfile до первого изменения / отсутствия кэширования. Чтобы внести изменения в уведомление о сборке в baseimage
, необходимо выполнить docker pull baseimage:latest
до сборки, чтобы при следующем запуске использовалось новое содержимое в теге latest
.
То же самое касается версионных тегов, когда они агрегируют второстепенные версии / версии исправлений, как при использовании baseimage:v1.2
, но программное обеспечение обновляется с baseimage:v1.2.3
до v1.2.4
, и по тому же процессу содержимое v1.2.4
публикуется как v1.2
. Так что знайте, как обрабатывается версия для определенного изображения.
Kubernetes
Когда вы используете :latest
для развертывания в Kubernetes, у вас обычно установлен imagePullPolicy: Always
. Что касается сборки Docker выше, означает, что изображение всегда вытягивается перед запуском. Это далеко от идеала и далеко не неизменно. В зависимости от момента перезапуска контейнера вы можете одновременно запустить два модуля: оба одинаковых изображения :latest
, но для каждого из них :latest
будет означать различное действительное изображение под ним.
Кроме того, вы не можете реально изменить изображение в Deployment
с :latest
на :latest
, потому что это, очевидно, не изменится, означая, что вам не повезло запускать непрерывное обновление, если вы не передадите версию в метке или чем-то еще .
Хорошей практикой является как-то версия ваших образов и загрузка обновлений в кластер с этой версией. Вот как это разработано и предназначено для использования в целом. Вот некоторые схемы управления версиями:
- семантическая (т.е. v1.2.7): хорошо, если ваш инструмент CI / CD хорошо его поддерживает, я использовал его в Concourse CI
- git_sha: работает во многих случаях, но проблематично для пересборок, которые не вызваны изменениями кода
branch-buildnum
или branch-sha-buildnum
: мы используем его довольно часто
это не значит, что я не пользуюсь последним. На самом деле большинство моих сборок построено как branch-num
, но когда они выпускаются в производство, они также помечаются и помещаются в реестр как branch-latest
(т.е. для prod как master-latest
), что очень полезно, когда вы хотите развернуть новый кластер с текущими производственными версиями (значения тегов по умолчанию в наших таблицах руля указывают на последние и устанавливаются на определенный тег при выпуске через CI)