MAATRIX / Блог / Автообновление Watchtower на сервере: частые ошибки и решения

Автообновление Watchtower на сервере: частые ошибки и решения

Автообновление Watchtower на сервере: частые ошибки и решения

MAATRIX

Watchtower поставили ради спокойствия, а получили новые вопросы: контейнеры не обновляются, хотя новая версия вышла, или наоборот — ночью приехал latest и сломал рабочий сервис, а приватный реестр Watchtower вообще не тянет. Эти ошибки автообновления Watchtower на сервере предсказуемы, и каждая лечится настройкой или сменой подхода. Разберём их по схеме «симптом — причина — решение».

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Как понять, что делает Watchtower

У Watchtower нет интерфейса, поэтому единственный источник правды — его логи. С них начинается любая диагностика:

docker logs watchtower
docker logs --tail=50 -f watchtower

В логах видно всё важное: сколько контейнеров он отслеживает, когда была последняя проверка, нашлись ли обновления и не было ли ошибок доступа к реестру. Если вы не понимаете, почему обновление не произошло, ответ почти всегда там. Для проверки на месте, не дожидаясь расписания, запустите разовую проверку временным контейнером:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
  containrrr/watchtower --run-once

Она пройдётся по контейнерам прямо сейчас и подробно отчитается, что нашла и что сделала. Это лучший способ отладки: вы сразу видите поведение, а не гадаете. Держа логи и --run-once под рукой, вы быстро отнесёте проблему к нужной категории. Дальше — разбор частых симптомов.

Watchtower не обновляет контейнеры

Частый симптом: новая версия образа давно вышла, а контейнер как стоял, так и стоит. Причин несколько. Первая и очень частая — включён режим контроля по меткам (--label-enable), но на контейнере не стоит разрешающая метка. В этом режиме Watchtower трогает только помеченные контейнеры, а остальные игнорирует. Проверьте метки и логи:

docker inspect app | grep -i watchtower

Если метки нет, добавьте её в описание контейнера и пересоздайте его:

labels:
  - "com.centurylinklabs.watchtower.enable=true"

Вторая причина — контейнер следит за фиксированной версией тега, например myapp:1.4.0. Watchtower обновляет контейнер только когда меняется образ под тем же тегом, а конкретная версия по определению не меняется. Для автообновления сервис должен использовать подвижный тег вроде stable или latest — но помните, что это же и создаёт риск, о котором ниже. Третья причина — Watchtower просто ещё не дошёл до времени проверки: посмотрите расписание и дождитесь окна или запустите --run-once.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

Арендовать VPS

Обновление сломало рабочий сервис

Обратная и болезненная ситуация: Watchtower ночью подтянул новую версию, и утром сервис не работает или ведёт себя иначе. Причина в автообновлении подвижного тега latest, под которым однажды приехала версия с несовместимыми изменениями. Это не баг Watchtower — он сделал ровно то, что ему велели, — а следствие рискованной стратегии.

Первое, что нужно, — вернуться на рабочую версию. Если вы фиксируете версии, откат — это возврат тега образа на прежний и пересоздание контейнера:

docker compose pull app
docker compose up -d app

Но правильное решение — изменить подход, чтобы это не повторилось. Критичные сервисы, особенно с базой данных, не отдают на полное автообновление. Для них используют режим только мониторинга, когда Watchtower уведомляет о новой версии, но не применяет её:

docker run -d --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  containrrr/watchtower --monitor-only

Так вы узнаёте о выходе версии, тестируете её и накатываете сами в удобное окно. Автообновление оставляют только вспомогательным сервисам, где обновление в пределах тега безопасно. И всегда держите бэкапы данных — тогда даже неудачное обновление не станет катастрофой.

Не тянет образы из приватного реестра

Симптом: публичные образы Watchtower обновляет, а контейнеры из вашего приватного реестра — нет, в логах ошибки авторизации или отказа доступа. Причина в том, что Watchtower не знает учётных данных вашего реестра. Для доступа он использует конфигурацию Docker, где хранятся логины после docker login.

Смонтируйте файл конфигурации Docker с учётными данными в контейнер Watchtower:

docker run -d --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /root/.docker/config.json:/config.json \
  containrrr/watchtower

Файл config.json появляется после успешного docker login registry.example.com на хосте и содержит токен доступа. Без него Watchtower обращается к приватному реестру анонимно и получает отказ. Убедитесь, что логин на хосте действительно выполнен и токен в файле не протух. Если реестр требует периодического обновления токена, продумайте, чтобы учётные данные оставались валидными, иначе автообновление приватных образов будет тихо падать.

Задвоение, старые контейнеры и мусор

Иногда после обновлений на сервере накапливается мусор: старые образы занимают диск, а в редких случаях кажется, что контейнер «задвоился». Со старыми образами всё просто — по умолчанию Watchtower не удаляет их после обновления, и они копятся. Включите очистку флагом --cleanup:

docker run -d --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  containrrr/watchtower --cleanup

Флаг --cleanup удаляет старый образ сразу после успешного обновления, экономя диск. Проверить, сколько занято образами, можно так:

docker system df
docker image prune -f

Что касается «задвоения» — обычно это иллюзия: Watchtower при обновлении создаёт новый контейнер и удаляет старый, и в момент перехода они могут кратко сосуществовать. Если же старые остановленные контейнеры реально копятся, дело может быть в ручных запусках вперемешку с автообновлением. Держите единый способ управления сервисами — через compose или через Watchtower — и не смешивайте. Это избавляет от путаницы, кто и что запустил.

Профилактика и разумная стратегия

Большинство проблем Watchtower — это не столько ошибки, сколько последствия неверной стратегии. Ключевой принцип: разделяйте сервисы на те, что можно автообновлять, и те, что нельзя. Вспомогательные утилиты и прокси — автообновление по меткам с очисткой. Критичные приложения с данными — только мониторинг и ручное применение. Так вы получаете свежесть без риска внезапных поломок.

Технически закрепите это несколькими настройками: включите --label-enable и помечайте только безопасные сервисы, добавьте --cleanup против мусора, смонтируйте config.json для приватного реестра и настройте уведомления, чтобы знать о каждом обновлении. Обязательно держите бэкапы данных в томах — это ваша страховка на случай неудачного обновления. И следите за ресурсами сервера: чем больше контейнеров, тем больше нагрузка при одновременных обновлениях и тем важнее запас по памяти и диску. Когда сервер перестаёт справляться, надёжнее перейти на VPS помощнее — у MAATRIX это доступно в локациях RU, US и UK с оплатой из России картой или криптой.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

Арендовать VPS

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Частые вопросы

Почему Watchtower не обновляет контейнер?

Скорее всего включён режим меток без разрешающей метки на контейнере, либо контейнер следит за фиксированной версией тега, которая не меняется; проверьте метки и логи.

Как откатиться, если обновление сломало сервис?

Верните прежний тег образа и пересоздайте контейнер; впредь используйте для критичных сервисов режим --monitor-only и фиксированные версии.

Почему Watchtower не тянет из приватного реестра?

Он не знает учётных данных; смонтируйте config.json с токеном после docker login в контейнер Watchtower.

Как избавиться от накопления старых образов?

Запускайте Watchtower с флагом --cleanup, который удаляет старый образ после обновления, и периодически чистите диск через docker image prune.

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.