Всем привет.
Потребовалось настроить автоматическое обновление контейнеров после публикации обновленных образов в репозитории.
Можно это сделать в pipeline Ci\CD Gitlab’а, но в данном конкретном случае было принято решение воспользоваться отдельным инструментом.
Собственно, Watchtower — есть тот самый инструмент. Сразу скажу, что проект давно не развивается, судя по github’ у, но тем не менее решили его использовать (пока что).
Хорошее или плохое такое решение — пусть каждый сам судит.
Итак…
Подготовка.
У нас используется 2 разных репозитория Nexus для хранения образов Docker:
1-й внутренний. Там лежат, скажем так, не изменяемые образы, которые мы используем в своём проекте.
2- й внешний. Там лежат образы проекта, которые обновляются по мере устранения ошибок, добавления функционала и т.п.
Надо создать файл конфигурации с адресами и доступами к данным репозиториям.
Все адреса и названия приведены для примера. У себя надо указывать реальные.
Создадим сам файл конфигурации
1 | nano config.json |
с таким содержимым:
1 2 3 4 5 6 7 8 9 10 | { "auths": { "nexus1.internal.local": { "auth": "Z******************************************I" }, "nexus2.external.glob": { "auth": "d===========================================" } } } |
где:
- nexus1.internal.local — внутренний репозиторий,
- nexus2.external.glob — внешний репозиторий.
- auth — данные для авторизации
Auth создать можно так:
1 | echo -n 'user1:password1' | base64 |
где:
- user1 — имя пользователя,
- password1 — пароль пользователя.
и полученное значение вставить в двойные кавычки — »
Теперь подготовим файл для docker-compose:
1 | nano docker-compose.yml |
с таким содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 | version: "3.4" services: watchtower: image: containrrr/watchtower container_name: docker_watch restart: always environment: TZ: Europe/Moscow WATCHTOWER_POLL_INTERVAL: 60 volumes: - ${PWD}/config.json:/config.json - /var/run/docker.sock:/var/run/docker.sock |
где:
- image — используемый образ,
- container_name — название будущего контейнера,
- restart — политика перезапуска контейнера,
- enviroment — окружение:
- TZ: Europe/Moscow — временная зона,
- WATCHTOWER_POLL_INTERVAL: 60 — время проверки новых образов в репозиториях в секундах,
- volumes — то, что будет «прокинуто» в контейнер.
- созданный выше файл конфигурации,
- и сокет самого docker’а.
1 2 3 4 | http_proxy: http://192.168.1.14:3128 https_proxy: http://192.168.1.14:3128 HTTP_PROXY: http://192.168.1.14:3128 HTTPs_PROXY: http://192.168.1.14:3128 |
добавить в environment заменив адрес и порт на свои
Это самый просто пример. Если что-то более экзотическое надо, то в руководстве всё описано.
Сам запуск:
1 | docker-compose up -d |
Лог запуска у меня такой (я использовал форк-версию):
1 2 3 4 5 6 7 8 | time="2025-06-03T12:00:48+03:00" level=info msg="Watchtower 2.3.1" time="2025-06-03T12:00:48+03:00" level=info msg="Using no notifications" time="2025-06-03T12:00:48+03:00" level=info msg="Checking all containers (except explicitly disabled with label)" time="2025-06-03T12:00:48+03:00" level=info msg="Scheduling first run: 2025-06-03 12:01:48 +0300 MSK" time="2025-06-03T12:00:48+03:00" level=info msg="Note that the first check will be performed in 59 seconds" time="2025-06-03T12:01:50+03:00" level=info msg="Session done" Failed=0 Scanned=9 Updated=0 notify=no time="2025-06-03T12:02:50+03:00" level=info msg="Session done" Failed=0 Scanned=9 Updated=0 notify=no time="2025-06-03T12:03:50+03:00" level=info msg="Session done" Failed=0 Scanned=9 Updated=0 notify=no |
Как видно он каждую минуту проверяет обновление. И посчитал количество контейнеров.
На момент создания этой заметки обновлять было нечего, т.ч. ниже будет лог раннего тестирования:
1 2 3 4 5 6 7 8 9 10 11 | time="2025-06-03T10:58:03+03:00" level=info msg="Found new nexus2.external.glob/repository/*****/admin-backend:latest image (3518ba4a2a77)" time="2025-06-03T10:58:03+03:00" level=info msg="Stopping /*****-admin-backend (c2219791e7b6) with SIGTERM" time="2025-06-03T10:58:04+03:00" level=info msg="Creating /*****-admin-backend" time="2025-06-03T11:05:39+03:00" level=info msg="Found new nexus2.external.glob/repository/*****/public-backend:latest image (c74c991a7ca3)" time="2025-06-03T11:05:42+03:00" level=info msg="Found new nexus2.external.glob/repository/*****/mobile-backend:latest image (767f887ffe2b)" time="2025-06-03T11:05:42+03:00" level=info msg="Stopping /mobile-backend (b7e9e8060441) with SIGTERM" time="2025-06-03T11:05:43+03:00" level=info msg="Stopping /*****-pub-backend (4620034cc58b) with SIGTERM" time="2025-06-03T11:05:44+03:00" level=info msg="Creating /*****-pub-backend" time="2025-06-03T11:05:44+03:00" level=info msg="Creating /mobile-backend" time="2025-06-03T11:05:45+03:00" level=info msg="Session done" Failed=0 Scanned=9 Updated=2 notify=no |
Как видно успешное обновление.
Так же можно настроить оповещение про обновление, но я пока это не делал. Позже добавлю, как разберусь.
[Заметка_дополняется]
Ссылки:
Образы контейнеров:
оригинал: containrrr_watchtower_latest
форк (для систем x64): beatkin_watchtower_adm64-latest
If you found an error, highlight it and press Shift + Enter or to inform us.