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

Как работает Watchtower

Сервис подключается к Docker API, периодически проверяет digest образа в реестре и сравнивает его с локальным. Если появилась новая версия, Watchtower загружает её, останавливает контейнер и создаёт новый с теми же параметрами. Файл docker-compose.yml при этом не меняется, а тег остаётся прежним — обновляется только содержимое образа.

Важно понимать границы: Watchtower не выполняет миграции баз данных, не проверяет здоровье приложения и не откатывает изменения. Для stateful-сервисов вроде PostgreSQL, Nextcloud или GitLab автоматическое обновление без бэкапа — плохая идея. Ещё один нюанс — архитектура: образ для amd64 не заменит arm64-сборку, поэтому на Raspberry Pi и других ARM-платах проверяйте наличие нужного манифеста.

Установка через Docker Compose

Добавьте отдельный сервис в compose-файл. Сокет Docker монтируется внутрь контейнера, потому что иначе Watchtower не сможет управлять соседними контейнерами. Каталог с конфигурацией нужен для настроек и кэша.

services:
  watchtower:
    image: containrrr/watchtower:latest
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./watchtower:/config
    environment:
      - TZ=Europe/Moscow
      - WATCHTOWER_CLEANUP=false
      - WATCHTOWER_SCHEDULE=0 0 4 * * *

Оригинальный образ containrrr/watchtower долгое время находится в режиме поддержки, поэтому проверьте, какая сборка актуальна: сообщество ведёт форк nicholas-fedor/watchtower. Перед сменой образа прочитайте release notes и закрепите digest, чтобы обновление было предсказуемым.

docker compose up -d watchtower
docker compose logs -f watchtower

После старта убедитесь, что контейнер не перезапускается по кругу. Частая причина — опечатка в расписании или отсутствие доступа к сокету. Логи в интерактивном режиме показывают первые проверки и список найденных контейнеров.

Первый запуск и проверка

Не начинайте с боевого сервера. Запустите Watchtower в режиме мониторинга: он покажет, какие контейнеры обновились бы, но ничего не тронет. Затем проверьте логи и только после этого переходите к реальным действиям.

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --run-once --monitor-only
docker compose logs watchtower --tail 100

Флаг —run-once выполняет один цикл и завершается, что удобно для cron или ручной проверки. В постоянном режиме интервал по умолчанию — сутки; расписание задаётся через cron из шести полей, где первое поле — секунды.

Выборочные обновления

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

  • com.centurylinklabs.watchtower.enable=true — разрешить обновление.
  • com.centurylinklabs.watchtower.enable=false — исключить сервис.
  • com.centurylinklabs.watchtower.monitor-only=true — только уведомлять.
docker run -d --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e WATCHTOWER_LABEL_ENABLE=true \
  containrrr/watchtower --interval 3600

Метки ставятся в compose-файле сервиса. Такой подход удобен для домашнего сервера: обновляются только простые stateless-контейнеры, а базы и файловые хранилища остаются на обслуживании по расписанию.

Расписание и уведомления

Ночное окно снижает риск, что обновление совпадёт с работой пользователей. Не ставьте обновление на час, когда начинается резервное копирование: два тяжёлых процесса будут мешать друг другу. Уведомления через Shoutrrr помогают узнать о проблеме, не заходя на сервер: Watchtower умеет отправлять сообщения в почту, мессенджеры и вебхуки, если задать URL получателя.

Секреты храните в env-файле с правами 600, а не в репозитории. Если уведомления не приходят, проверьте синтаксис URL и доступ контейнера в сеть. Для приватных реестров подключите конфигурацию Docker с учётными данными и убедитесь, что Watchtower читает её из правильного пути.

Публичный Docker Hub ограничивает число анонимных загрузок, поэтому при десятке контейнеров лучше авторизоваться или использовать собственное зеркало. Иначе обновление может упасть с ошибкой лимита, а сервис останется на старой версии.

Базы данных и состояние

Watchtower перезапускает контейнер, но не готовит приложение к новой схеме. Перед обновлением PostgreSQL, MariaDB, Nextcloud и аналогичных сервисов делайте дамп и проверяйте совместимость версий. Для compose-стека надёжнее ручная схема: сначала pull, затем up -d и проверка здоровья.

docker compose pull
docker compose up -d
docker compose ps

Если сервис не поднялся, вернитесь к предыдущему образу. Держите его локально: агрессивная очистка удаляет точку отката. Флаг —cleanup удобен, но включайте его только там, где откат не нужен.

Откат и версии

Перед обновлением зафиксируйте digest текущего образа. Если новая версия сломалась, разверните контейнер по старому digest или тегу. Тег latest не гарантирует предсказуемость: сегодня он указывает на одну сборку, завтра на другую.

docker image inspect nginx:latest --format '{{index .RepoDigests 0}}'
docker image ls --digests

Для критичных сервисов используйте точные версии и обновляйтесь осознанно. Watchtower тогда пригодится для вспомогательных контейнеров, а не для всего стека.

Безопасность

Доступ к docker.sock фактически равен root на хосте: через API можно запустить привилегированный контейнер и смонтировать файловую систему. Не публикуйте сокет в сеть и не давайте Watchtower лишних прав. В идеале ограничьте API через socket-proxy и отдельную сеть. Rootless-режим Docker снижает риск, но не отменяет необходимость доверять образу и реестру.

Обновление образов — это ещё и supply chain: доверяйте официальным реестрам, проверяйте подписи и не тяните случайные образы с похожими именами. Логи Watchtower не должны содержать токены и пароли.

Чек-лист

  • Watchtower запущен в monitor-only и проверен на тесте.
  • Обновляются только помеченные контейнеры.
  • Для баз настроены дампы и окно обслуживания.
  • Предыдущий digest сохранён для отката.
  • Уведомления работают, секреты не в git.
  • Доступ к Docker API ограничен.

Итог

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

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте