Тег - змінна мітка, що вказує на конкретний образ. latest - просто тег за замовчуванням, коли інший не вказано. Він не означає «найновіша версія»: це той образ, який останнім отримав цей тег.
Чому latest у продакшені - проблема:
- невідомо, що запущено:
myapp:latestвчора й сьогодні - різні образи. Розслідуючи інцидент, неможливо сказати, яка версія коду працювала; - неможливий надійний відкат: «повернутися на попередню версію» - на яку?
latestуже перезаписано; - різні сервери - різні версії: сервер, що завантажив образ раніше, і новий сервер після масштабування отримають різні образи під тим самим тегом;
- неявні оновлення: перезапуск контейнера чи новий вузол кластера раптом підтягує нову версію без деплою.
Як тегувати:
- незмінні теги з git SHA:
myapp:sha-a1b2c3d- однозначний зв'язок образу з комітом. Такий тег ніколи не перезаписується; - семантичні версії для релізів:
myapp:1.4.2, плюс за бажанням «плаваючі»myapp:1.4іmyapp:1для зручності; - кілька тегів на один образ - нормально: CI ставить і
sha-a1b2c3d, і1.4.2; latest- хіба що для локальної розробки чи як мітка «останньої збірки main», але не в конфігурації деплою.
docker build -t ghcr.io/acme/app:sha-a1b2c3d -t ghcr.io/acme/app:1.4.2 .
docker push --all-tags ghcr.io/acme/app
Ще надійніше - дайджест: ghcr.io/acme/app@sha256:... - адреса вмісту образу. На відміну від тегу, дайджест змінити неможливо: той самий дайджест завжди означає ті самі байти.
Те саме стосується базових образів у Dockerfile: FROM php:latest чи навіть FROM php:8.5-fpm може тихо змінитися між збираннями - версії варто фіксувати точніше.
Правило: у продакшені має бути можливо відповісти «який саме код зараз працює» і «як повернутися на попередню версію» за одну хвилину.