"Быстрый
<br />
Watchtower (официальный) заархивирован в декабре 2025 и не работает с Docker 29+. Варианта два:</p>
<p>1. Хочешь автообновление без рук — ставь nickfedor/watchtower, рабочий форк с поддержкой <a class="wpil_keyword_link" href="https://it-apteka.com/tag/docker/" target="_blank" rel="noopener" title="Docker" data-wpil-keyword-link="linked" data-wpil-monitor-id="2890">Docker</a> API 1.44+.<br />
2. Хочешь контроль и уведомления без автозамены образов — ставь Diun (crazy-max/diun), получай алерты в <a class="wpil_keyword_link" href="https://t.me/it_apteka_com/34" target="_blank" rel="noopener" title="Telegram" data-wpil-keyword-link="linked" data-wpil-monitor-id="2888">Telegram</a> и обновляй сам.<br />
3. Продакшн — не трогай ни то ни другое автоматически. Там нужен CI/CD.<br />
4. Проверить что работает: docker logs watchtower —tail 20 и смотришь нет ли client version 1.25 is too old.<br />
<h2>Диагноз: почему это вообще вопрос</h2>
<p>Ты поднял 15 контейнеров на домашнем <a href="https://it-apteka.com/docker-compose-dlja-domashnego-servera-struktura-reverse-proxy-sekrety-i-obnovlenija/" title="Docker Compose для домашнего сервера: структура, reverse proxy, секреты и обновления" target="_blank" rel="noopener" data-wpil-monitor-id="2912">сервере</a> и теперь каждую неделю вручную тянешь docker pull для каждого. Либо забил и не тянешь — и сидишь на образах полугодовой давности с дырами в безопасности, о которых уже написали на HackerNews.</p>
<p>Либо ты слышал про Watchtower, поставил его, и в какой-то момент увидел в логах вот это:</p>
<pre><code class="language-bash">
level=error msg="Error response from daemon: client version 1.25 is too old.
Minimum supported API version is 1.44, please upgrade your client to a newer version"
</code></pre>
<p>Watchtower работал годами. Потом Docker 29 вышел и поднял минимальную версию API. Официальный containrrr/watchtower два года не обновлялся — и в декабре 2025 репозиторий тихо заархивировали. Read-only. Done.</p>
<p>Хорошая новость: решения есть. Статья покажет два рабочих варианта с конкретными конфигами, объяснит когда что выбирать и закроет типичные ошибки.</p>
<p>Что тебе понадобится:</p>
<ul>
<li>Docker 25+ (проверь: docker version)</li>
<li>Docker Compose v2</li>
<li>10 минут</li>
<li>Telegram-бот для уведомлений (опционально, но удобно)</li>
</ul>
<h2>Что сломалось и почему: история Watchtower</h2>
<p>Watchtower от containrrr был стандартом де-факто для homelab-обновлений. Простой, понятный, работал через монтирование docker.sock. Последний коммит — больше двух лет назад.</p>
<p>В ноябре 2025 Docker выпустил версию 29.0, которая подняла минимальную версию API до 1.44. Watchtower внутри использовал клиентскую библиотеку, хардкодящую API 1.25. Итог: контейнер стартует, падает в цикл, в логах только ошибка про версию API. 17 декабря 2025 containrrr/watchtower официально заархивирован.</p>
<p>Действующие варианта сейчас три:</p>
<table>
<thead>
<tr>
<th>Инструмент</th>
<th>Что делает</th>
<th>Статус</th>
<th>Docker 29+</th>
</tr>
</thead>
<tbody>
<tr>
<td>containrrr/watchtower</td>
<td>Автообновление</td>
<td>Заархивирован</td>
<td>Не работает</td>
</tr>
<tr>
<td>nickfedor/watchtower</td>
<td>Автообновление</td>
<td>Активный форк</td>
<td>Работает</td>
</tr>
<tr>
<td>crazy-max/diun</td>
<td>Уведомления об обновлениях</td>
<td>Активная разработка</td>
<td>Работает</td>
</tr>
</tbody>
</table>
<h2>Как работает автообновление: схема</h2>
<pre class="mermaid">
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
A["Watchtower / Diun"] --> B["docker.sock"]
B --> C["Список запущенных контейнеров"]
C --> D["Запрос к реестру Docker Hub"]
D --> E{"Новый дайджест?"}
E -->|"Нет"| F["Ничего не делать"]
E -->|"Да"| G{"Режим работы"}
G -->|"Watchtower"| H["Pull нового образа"]
G -->|"Diun"| I["Отправить уведомление"]
H --> J["Перезапуск контейнера"]
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style E fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#c2410c
style H fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style I fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style F fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#475569
style J fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
</pre>
<h2>Вариант 1: nickfedor/watchtower — автообновление с нуля</h2>
<p>Форк от Nicholas Fedor — прямой преемник containrrr/watchtower. API-версия поднята, autonegotiation включён по умолчанию. Конфиг полностью совместим со старым Watchtower, меняешь только имя образа.</p>
<h3>Системные требования</h3>
<table>
<thead>
<tr>
<th>Компонент</th>
<th>Минимум</th>
<th>Рекомендуется</th>
</tr>
</thead>
<tbody>
<tr>
<td>Docker Engine</td>
<td>25.0 (API 1.44)</td>
<td>27.0+</td>
</tr>
<tr>
<td>Docker Compose</td>
<td>v2.0</td>
<td>v2.20+</td>
</tr>
<tr>
<td>ОС</td>
<td><a class="wpil_keyword_link" href="https://it-apteka.com/category/linux/" target="_blank" rel="noopener" title="Linux" data-wpil-keyword-link="linked" data-wpil-monitor-id="2893">Linux</a> x86_64</td>
<td>Ubuntu 22.04 / <a class="wpil_keyword_link" href="https://it-apteka.com/tag/debian/" target="_blank" rel="noopener" title="Debian" data-wpil-keyword-link="linked" data-wpil-monitor-id="2889">Debian</a> 12</td>
</tr>
<tr>
<td>RAM</td>
<td>64 MB</td>
<td>128 MB</td>
</tr>
</tbody>
</table>
<p>На момент публикации актуальна версия nickfedor/watchtower:1.12.3. Перед установкой проверь свежие релизы на <a href="https://hub.docker.com/r/nickfedor/watchtower" rel="nofollow" target="_blank">Docker Hub</a>.</p>
<h3>Установка через Docker Compose</h3>
<p>Создай файл docker-compose.yml. Это базовая конфигурация для homelab — обновляет все контейнеры раз в сутки и чистит старые образы.</p>
<pre><code class="language-text">
services:
watchtower:
image: nickfedor/watchtower:latest
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Europe/Moscow
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_INCLUDE_RESTARTING=true
- WATCHTOWER_POLL_INTERVAL=86400
</code></pre>
<p>Запусти:</p>
<pre><code class="language-bash">
docker compose up -d
</code></pre>
<p>Проверь что запустился нормально:</p>
<pre><code class="language-bash">
docker logs watchtower --tail 30
</code></pre>
<p>В логах должно быть что-то вроде:</p>
<pre><code class="language-bash">
time="..." level=info msg="Starting Watchtower and scheduling first run"
time="..." level=info msg="Running watchtower"
</code></pre>
<p>Если видишь client version 1.25 is too old — ты всё ещё используешь старый containrrr/watchtower. Замени образ.</p>
<h3>Расширенный конфиг с уведомлениями в Telegram</h3>
<p>Watchtower умеет слать уведомления через shoutrrr. Telegram — самый удобный вариант для большинства. Нужен токен бота и chat_id.</p>
"Как
<br />
Создай бота через @BotFather — получишь токен вида 123456789:AAFabc… Потом напиши боту любое сообщение и открой: https://api.telegram.org/bot{TOKEN}/getUpdates — там найдёшь chat id.<br />
<pre><code class="language-text">
services:
watchtower:
image: nickfedor/watchtower:latest
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Europe/Moscow
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_INCLUDE_RESTARTING=true
- WATCHTOWER_POLL_INTERVAL=86400
- WATCHTOWER_NOTIFICATIONS=shoutrrr
- WATCHTOWER_NOTIFICATION_SHOUTRRR_URL=telegram://TOKEN@telegram?channels=CHAT_ID
- WATCHTOWER_NOTIFICATION_REPORT=true
</code></pre>
<h3>Обновление только выбранных контейнеров</h3>
<p>По умолчанию Watchtower обновляет всё что видит. Это не всегда нужно. Два способа ограничить область.</p>
<p>Способ первый — разрешить только помеченные контейнеры. В compose Watchtower добавь переменную:</p>
<pre><code class="language-text">
- WATCHTOWER_LABEL_ENABLE=true
</code></pre>
<p>Потом у контейнеров которые хочешь обновлять добавь label:</p>
<pre><code class="language-text">
services:
nginx:
image: nginx:latest
labels:
- "com.centurylinklabs.watchtower.enable=true"
</code></pre>
<p>Способ второй — явно исключи контейнеры которые трогать нельзя:</p>
<pre><code class="language-text">
services:
postgres:
image: postgres:15
labels:
- "com.centurylinklabs.watchtower.enable=false"
</code></pre>
<p>БД особенно любят такое — накатил новый образ без проверки миграций и получил несовместимость. Базы данных из автообновления исключай всегда.</p>
<h3>Запуск по расписанию через cron</h3>
<p>Если нужно обновлять строго в определённое время — используй WATCHTOWER_SCHEDULE вместо POLL_INTERVAL. Синтаксис cron, но с секундами в начале.</p>
<pre><code class="language-text">
# Каждое воскресенье в 03:00
- WATCHTOWER_SCHEDULE=0 0 3 * * 0
</code></pre>
<h2>Вариант 2: Diun — контроль вместо автоматизации</h2>
<p>Diun (Docker Image Update Notifier) от CrazyMax делает одно: смотрит на твои образы и сообщает когда вышло обновление. Сам ничего не трогает. Ты решаешь когда обновлять и обновлять ли вообще.</p>
<p>Это именно то что нужно если у тебя есть хоть один контейнер, которого нельзя перезапустить без подготовки. Или если ты хочешь читать changelog перед обновлением. Или если просто не доверяешь автоматике в 3 ночи.</p>
<h3>Установка Diun через Docker Compose</h3>
<pre><code class="language-text">
services:
diun:
image: crazymax/diun:latest
container_name: diun
restart: unless-stopped
command: serve
volumes:
- ./diun-data:/data
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Europe/Moscow
- LOG_LEVEL=info
- LOG_JSON=false
- DIUN_WATCH_WORKERS=20
- DIUN_WATCH_SCHEDULE=0 */6 * * *
- DIUN_WATCH_JITTER=30s
- DIUN_PROVIDERS_DOCKER=true
- DIUN_PROVIDERS_DOCKER_WATCHBYDEFAULT=true
</code></pre>
<p>Запусти и проверь:</p>
<pre><code class="language-bash">
docker compose up -d
docker logs diun --tail 30
</code></pre>
<h3>Подключение уведомлений Telegram к Diun</h3>
<p>Diun поддерживает Telegram, Discord, Slack, Matrix, Gotify, Pushover, email и ещё десяток каналов. <a href="https://it-apteka.com/n8n-ustanovka-i-nastrojka-docker-telegram-ai-agenty/" title="n8n установка и настройка: Docker, Telegram, AI-агенты" target="_blank" rel="noopener" data-wpil-monitor-id="2910">Telegram — самый быстрый для настройки</a>.</p>
<pre><code class="language-text">
services:
diun:
image: crazymax/diun:latest
container_name: diun
restart: unless-stopped
command: serve
volumes:
- ./diun-data:/data
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Europe/Moscow
- LOG_LEVEL=info
- DIUN_WATCH_WORKERS=20
- DIUN_WATCH_SCHEDULE=0 */6 * * *
- DIUN_WATCH_JITTER=30s
- DIUN_PROVIDERS_DOCKER=true
- DIUN_PROVIDERS_DOCKER_WATCHBYDEFAULT=true
- DIUN_NOTIF_TELEGRAM_TOKEN=123456789:AAFabc...
- DIUN_NOTIF_TELEGRAM_CHATIDS=-100123456789
</code></pre>
<p>Протестируй уведомление не дожидаясь планового запуска:</p>
<pre><code class="language-bash">
docker exec diun diun notif test
</code></pre>
<p>В Telegram должно прийти тестовое сообщение от бота.</p>
<h3>Мониторинг только выбранных контейнеров в Diun</h3>
<p>Если WATCHBYDEFAULT=true — Diun следит за всем. Если хочешь только часть контейнеров — выключи флаг и добавляй labels вручную.</p>
<pre><code class="language-text">
- DIUN_PROVIDERS_DOCKER_WATCHBYDEFAULT=false
</code></pre>
<p>Потом у нужных контейнеров:</p>
<pre><code class="language-text">
services:
nginx:
image: nginx:latest
labels:
- "diun.enable=true"
</code></pre>
<p>Diun умеет следить и за конкретными тегами. Если тебе важно знать когда вышел новый patch-релиз образа с тегом 1.24.x — настрой semver-фильтр через label diun.watch_repo=true.</p>
<h2>Сравнение: что выбрать</h2>
<table>
<thead>
<tr>
<th>Критерий</th>
<th>nickfedor/watchtower</th>
<th>crazy-max/diun</th>
</tr>
</thead>
<tbody>
<tr>
<td>Что делает</td>
<td>Обновляет и перезапускает контейнеры</td>
<td>Только уведомляет об обновлениях</td>
</tr>
<tr>
<td>Нужно ли руками нажимать</td>
<td>Нет</td>
<td>Да</td>
</tr>
<tr>
<td>Риск даунтайма</td>
<td>Есть (перезапуск контейнера)</td>
<td>Нулевой</td>
</tr>
<tr>
<td>Поддержка Docker 29+</td>
<td>Да</td>
<td>Да</td>
</tr>
<tr>
<td>Уведомления Telegram</td>
<td>Да (через shoutrrr)</td>
<td>Да (нативно)</td>
</tr>
<tr>
<td>Для homelab без критичного</td>
<td>Идеально</td>
<td>Хорошо</td>
</tr>
<tr>
<td>Для prod или с БД</td>
<td>Нет</td>
<td>Да</td>
</tr>
<tr>
<td>Статус проекта</td>
<td>Активный форк (личный)</td>
<td>Активная разработка</td>
</tr>
<tr>
<td>Совместимость с containrrr</td>
<td>Полная (drop-in замена)</td>
<td>Разные инструменты</td>
</tr>
</tbody>
</table>
<p>Мой рецепт для homelab: Diun для слежения за всеми образами и уведомлений. Watchtower (nickfedor) — только для контейнеров без состояния, которые не жалко перезапустить в любой момент. БД, очереди, всё что хранит данные — только через Diun с ручным обновлением.</p>
<h2>Проверка работы</h2>
<h3>Watchtower</h3>
<p>Посмотреть логи и убедиться что нет ошибок API:</p>
<pre><code class="language-bash">
docker logs watchtower --tail 50 | grep -E "error|warn|info"
</code></pre>
<p>Принудительно запустить проверку прямо сейчас:</p>
<pre><code class="language-bash">
docker exec watchtower /watchtower --run-once
</code></pre>
<p>Проверить статус контейнера:</p>
<pre><code class="language-bash">
docker inspect watchtower | grep -E "Status|RestartCount"
</code></pre>
<p>RestartCount выше 2-3 — что-то не так, смотри полные логи.</p>
<h3>Diun</h3>
<p>Запустить принудительную проверку всех образов:</p>
<pre><code class="language-bash">
docker exec diun diun image list
</code></pre>
<p>Посмотреть историю обновлений:</p>
<pre><code class="language-bash">
docker exec diun diun image inspect --image nginx:latest
</code></pre>
<p>Проверить что все контейнеры в мониторинге:</p>
<pre><code class="language-bash">
docker logs diun 2>&1 | grep "Cron job"
</code></pre>
<h2>Осложнения и их лечение</h2>
<h3>client version 1.25 is too old</h3>
<p>Ты используешь containrrr/watchtower. Он заархивирован и не совместим с Docker 29+. Замени образ в docker-compose.yml:</p>
"Исправление:
<br />
Найди строку с containrrr/watchtower и замени на nickfedor/watchtower. Больше ничего менять не нужно — конфиг совместим полностью.<br />
<pre><code class="language-bash">
# Останови старый контейнер
docker compose down
# Обнови образ в docker-compose.yml:
# image: containrrr/watchtower --> image: nickfedor/watchtower
# Подними заново
docker compose up -d
</code></pre>
<h3>Watchtower обновил контейнер, приложение не работает</h3>
<p>Образ обновился, но что-то сломалось. Вернись на предыдущий образ через тег. Сначала посмотри что сейчас запущено:</p>
<pre><code class="language-bash">
docker inspect имя_контейнера | grep Image
</code></pre>
<p>Потом в docker-compose.yml замени latest на конкретный тег предыдущей версии и пересоздай контейнер. Урок на будущее: не используй тег latest для критичных сервисов — пиши конкретную версию.</p>
<h3>Diun не отправляет уведомления</h3>
<p>Проверь токен и chat_id. Chat_id для группового чата начинается с минуса (-100…). Для личного чата — положительное число. Распространённая ошибка — скопировать chat_id без минуса.</p>
<p>Запусти тест:</p>
<pre><code class="language-bash">
docker exec diun diun notif test
</code></pre>
<p>Если ошибка «Forbidden» — бот не добавлен в чат или заблокирован.</p>
<h3>Watchtower не видит приватный реестр</h3>
<p>Для приватных реестров нужен docker login перед запуском. Смонтируй конфиг авторизации:</p>
<pre><code class="language-text">
services:
watchtower:
image: nickfedor/watchtower:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /root/.docker/config.json:/config.json:ro
environment:
- DOCKER_CONFIG=/config.json
</code></pre>
<h3>Diun следит за одним образом, игнорирует остальные</h3>
<p>Скорее всего WATCHBYDEFAULT выключен и labels не проставлены. Либо включи WATCHBYDEFAULT=true, либо добавь label diun.enable=true ко всем нужным контейнерам.</p>
<h3>Watchtower не чистит старые образы</h3>
<p>Добавь переменную WATCHTOWER_CLEANUP=true. По умолчанию старые образы остаются и занимают место. Через неделю активной работы можешь обнаружить, что диск закончился. Капля никотина убивает лошадь, один latest без CLEANUP за месяц съедает 20 гигабайт.</p>
<h2>Безопасность: docker.sock и что с ним делать</h2>
<p>Оба инструмента монтируют /var/run/docker.sock. Это значит что у контейнера полный доступ к Docker-демону. Если контейнер скомпрометирован — у атакующего root на хосте. Это не паранойя, это факт архитектуры.</p>
<p>Минимальные меры:</p>
<ul>
<li>Не запускай Watchtower или Diun из чужих compose-файлов без проверки</li>
<li>Ограничь сеть контейнера — ему не нужен выход наружу кроме Docker Hub</li>
<li>Для Diun в режиме только-уведомлений доступ к сокету можно сделать read-only через <a href="https://it-apteka.com/ustanovka-i-nastrojka-socks5-proxy-dante-v-docker-compose/" title="Установка и настройка SOCKS5 proxy Dante в Docker Compose" target="_blank" rel="noopener" data-wpil-monitor-id="2913">Docker socket proxy</a> (Tecnativa/docker-socket-proxy)</li>
<li>Регулярно обновляй сам образ Watchtower или Diun</li>
</ul>
<p>Схема с socket proxy для Diun — правильный подход для параноиков:</p>
<pre class="mermaid">
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart LR
A["Diun"] --> B["Socket Proxy"]
B --> C["docker.sock"]
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style B fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#c2410c
style C fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
</pre>
<pre><code class="language-text">
services:
socket-proxy:
image: tecnativa/docker-socket-proxy
container_name: socket-proxy
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- CONTAINERS=1
- IMAGES=1
- INFO=1
networks:
- socket-proxy
diun:
image: crazymax/diun:latest
container_name: diun
restart: unless-stopped
command: serve
volumes:
- ./diun-data:/data
environment:
- TZ=Europe/Moscow
- DIUN_WATCH_SCHEDULE=0 */6 * * *
- DIUN_PROVIDERS_DOCKER=true
- DIUN_PROVIDERS_DOCKER_WATCHBYDEFAULT=true
- DIUN_PROVIDERS_DOCKER_ENDPOINT=tcp://socket-proxy:2375
- DIUN_NOTIF_TELEGRAM_TOKEN=TOKEN
- DIUN_NOTIF_TELEGRAM_CHATIDS=CHAT_ID
networks:
- socket-proxy
networks:
socket-proxy:
driver: bridge
</code></pre>
<h2>Резервное копирование и обновление самих инструментов</h2>
<p>Watchtower nickfedor обновляет себя сам — он мониторит собственный образ в том числе. Diun нужно обновлять вручную или добавить Watchtower для мониторинга образа Diun. Да, это выглядит рекурсивно.</p>
<p>Что реально бэкапить:</p>
<ul>
<li>docker-compose.yml с переменными (или .env файл рядом)</li>
<li>Папку diun-data/ — там база с историей образов</li>
<li>Конфиг авторизации Docker если используешь приватные реестры</li>
</ul>
<p>Минимальный <a class="wpil_keyword_link" href="https://it-apteka.com/category/rezervnoe-kopirovanie/" target="_blank" rel="noopener" title="Резервное копирование" data-wpil-keyword-link="linked" data-wpil-monitor-id="2891">backup</a> скрипт:</p>
<pre><code class="language-bash">
#!/bin/bash
BACKUP_DIR="/backup/docker-tools"
DATE=$(date +%Y%m%d)
mkdir -p "$BACKUP_DIR"
cp /opt/watchtower/docker-compose.yml "$BACKUP_DIR/watchtower-compose-$DATE.yml"
cp -r /opt/diun/diun-data "$BACKUP_DIR/diun-data-$DATE"
</code></pre>
<h2>Альтернативы: что ещё есть</h2>
<p>Если ни Watchtower ни Diun не подходят — вот короткий список:</p>
<ul>
<li><strong>What’s Up Docker (WUD)</strong> — веб-интерфейс, <a class="wpil_keyword_link" href="https://it-apteka.com/category/monitoring/" target="_blank" rel="noopener" title="Мониторинг" data-wpil-keyword-link="linked" data-wpil-monitor-id="2892">мониторинг</a> и уведомления, больше возможностей для фильтрации. Тяжелее Diun.</li>
<li><strong>Portainer</strong> — полноценный GUI для Docker. Есть мониторинг обновлений, но основная ценность не в этом.</li>
<li><strong>Renovate</strong> — если ты ведёшь docker-compose.yml в <a class="wpil_keyword_link" href="https://it-apteka.com/tag/git/" target="_blank" rel="noopener" title="Git" data-wpil-keyword-link="linked" data-wpil-monitor-id="2894">git</a>, Renovate откроет PR с обновлёнными тегами образов. CI/CD рулит.</li>
<li><strong>Komodo</strong> — упоминается в русскоязычном сообществе как альтернатива Watchtower с более широкими возможностями управления.</li>
</ul>
<p>Для продакшна правильный ответ — Kubernetes с FluxCD или ArgoCD. Там версионирование образов, rolling updates, автооткат. Но это уже другая история и другой уровень сложности.</p>
<h2>FAQ</h2>
<h3>Почему watchtower docker не работает после обновления?</h3>
<p>Скорее всего ты используешь официальный containrrr/watchtower, который заархивирован в декабре 2025 и не совместим с Docker 29+. Ошибка в логах: client version 1.25 is too old. Замени образ на nickfedor/watchtower — конфиг совместим полностью, менять кроме имени образа ничего не нужно.</p>
<h3>Как проверить что watchtower работает правильно?</h3>
<p>Запусти docker logs watchtower —tail 30 и убедись что нет строк с level=error. Должны быть строки Starting Watchtower и Running watchtower без ошибок. Принудительно запустить проверку: docker exec watchtower /watchtower —run-once.</p>
<h3>Что делать если watchtower обновил контейнер и всё сломалось?</h3>
<p>В docker-compose.yml замени тег latest на конкретную предыдущую версию образа, потом docker compose up -d —force-recreate. На будущее: не используй latest для сервисов с данными, пиши конкретный тег. И исключай БД из автообновления через label com.centurylinklabs.watchtower.enable=false.</p>
<h3>Чем diun отличается от watchtower?</h3>
<p>Diun только уведомляет о выходе нового образа — сам ничего не обновляет. Watchtower <a href="https://it-apteka.com/avtomaticheskoe-obnovlenie-docker-kontejnerov-polnoe-rukovodstvo-i-primery/" title="Автоматическое обновление Docker контейнеров: полное руководство и примеры" target="_blank" rel="noopener" data-wpil-monitor-id="2911">автоматически скачивает новый образ и перезапускает контейнер</a>. Diun безопаснее для продакшна и сервисов с данными: ты решаешь когда и как обновлять. Watchtower удобнее для homelab где важнее автоматизация, а не контроль.</p>
<h3>Как настроить docker update notifications в Telegram?</h3>
<p>Для Diun: добавь переменные DIUN_NOTIF_TELEGRAM_TOKEN и DIUN_NOTIF_TELEGRAM_CHATIDS в docker-compose.yml. Для Watchtower (nickfedor): переменные WATCHTOWER_NOTIFICATIONS=shoutrrr и WATCHTOWER_NOTIFICATION_SHOUTRRR_URL=telegram://TOKEN@telegram?channels=CHAT_ID. Протестируй командой docker exec diun diun notif test.</p>
<h3>Можно ли использовать watchtower в продакшне?</h3>
<p>Сам проект так не рекомендует: в документации написано «intended for homelabs, media centers, local dev environments». В продакшне автоматический перезапуск контейнеров без тестирования и согласования — это путь к инцидентам. Используй Diun для уведомлений, обновляй через CI/CD с rollback-планом.</p>
<h2>Итог</h2>
<p>containrrr/watchtower умер в декабре 2025. Не трогай его — он не совместим с текущими версиями Docker и обновлений не будет.</p>
<p>Для homelab без критичных данных: nickfedor/watchtower — drop-in замена, работает сразу, меняешь одну строку в compose-файле. Для всего остального, где важен контроль над тем что и когда обновляется: Diun с Telegram-уведомлениями. Ты видишь что вышло, читаешь changelog, обновляешь когда готов.</p>
"Не
<br />
Пиши в комментарии — покажи вывод docker logs watchtower и версию Docker (docker version). Разберёмся.<br />
Быстрый ответ
Watchtower (официальный) заархивирован в декабре 2025 и не работает с Docker 29+. Варианта два:
1. Хочешь автообновление без рук — ставь nickfedor/watchtower, рабочий форк с поддержкой Docker API 1.44+.
2. Хочешь контроль и уведомления без автозамены образов — ставь Diun (crazy-max/diun), получай алерты в Telegram и обновляй сам.
3. Продакшн — не трогай ни то ни другое автоматически. Там нужен CI/CD.
4. Проверить что работает: docker logs watchtower —tail 20 и смотришь нет ли client version 1.25 is too old.
Диагноз: почему это вообще вопрос
Ты поднял 15 контейнеров на домашнем сервере и теперь каждую неделю вручную тянешь docker pull для каждого. Либо забил и не тянешь — и сидишь на образах полугодовой давности с дырами в безопасности, о которых уже написали на HackerNews.
Либо ты слышал про Watchtower, поставил его, и в какой-то момент увидел в логах вот это:
level=error msg="Error response from daemon: client version 1.25 is too old.
Minimum supported API version is 1.44, please upgrade your client to a newer version"
Watchtower работал годами. Потом Docker 29 вышел и поднял минимальную версию API. Официальный containrrr/watchtower два года не обновлялся — и в декабре 2025 репозиторий тихо заархивировали. Read-only. Done.
Хорошая новость: решения есть. Статья покажет два рабочих варианта с конкретными конфигами, объяснит когда что выбирать и закроет типичные ошибки.
Что тебе понадобится:
- Docker 25+ (проверь: docker version)
- Docker Compose v2
- 10 минут
- Telegram-бот для уведомлений (опционально, но удобно)
Что сломалось и почему: история Watchtower
Watchtower от containrrr был стандартом де-факто для homelab-обновлений. Простой, понятный, работал через монтирование docker.sock. Последний коммит — больше двух лет назад.
В ноябре 2025 Docker выпустил версию 29.0, которая подняла минимальную версию API до 1.44. Watchtower внутри использовал клиентскую библиотеку, хардкодящую API 1.25. Итог: контейнер стартует, падает в цикл, в логах только ошибка про версию API. 17 декабря 2025 containrrr/watchtower официально заархивирован.
Действующие варианта сейчас три:
| Инструмент |
Что делает |
Статус |
Docker 29+ |
| containrrr/watchtower |
Автообновление |
Заархивирован |
Не работает |
| nickfedor/watchtower |
Автообновление |
Активный форк |
Работает |
| crazy-max/diun |
Уведомления об обновлениях |
Активная разработка |
Работает |
Как работает автообновление: схема
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
A["Watchtower / Diun"] --> B["docker.sock"]
B --> C["Список запущенных контейнеров"]
C --> D["Запрос к реестру Docker Hub"]
D --> E{"Новый дайджест?"}
E -->|"Нет"| F["Ничего не делать"]
E -->|"Да"| G{"Режим работы"}
G -->|"Watchtower"| H["Pull нового образа"]
G -->|"Diun"| I["Отправить уведомление"]
H --> J["Перезапуск контейнера"]
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style E fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#c2410c
style H fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style I fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style F fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#475569
style J fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
Вариант 1: nickfedor/watchtower — автообновление с нуля
Форк от Nicholas Fedor — прямой преемник containrrr/watchtower. API-версия поднята, autonegotiation включён по умолчанию. Конфиг полностью совместим со старым Watchtower, меняешь только имя образа.
Системные требования
| Компонент |
Минимум |
Рекомендуется |
| Docker Engine |
25.0 (API 1.44) |
27.0+ |
| Docker Compose |
v2.0 |
v2.20+ |
| ОС |
Linux x86_64 |
Ubuntu 22.04 / Debian 12 |
| RAM |
64 MB |
128 MB |
На момент публикации актуальна версия nickfedor/watchtower:1.12.3. Перед установкой проверь свежие релизы на Docker Hub.
Установка через Docker Compose
Создай файл docker-compose.yml. Это базовая конфигурация для homelab — обновляет все контейнеры раз в сутки и чистит старые образы.
services:
watchtower:
image: nickfedor/watchtower:latest
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Europe/Moscow
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_INCLUDE_RESTARTING=true
- WATCHTOWER_POLL_INTERVAL=86400
Запусти:
docker compose up -d
Проверь что запустился нормально:
docker logs watchtower --tail 30
В логах должно быть что-то вроде:
time="..." level=info msg="Starting Watchtower and scheduling first run"
time="..." level=info msg="Running watchtower"
Если видишь client version 1.25 is too old — ты всё ещё используешь старый containrrr/watchtower. Замени образ.
Расширенный конфиг с уведомлениями в Telegram
Watchtower умеет слать уведомления через shoutrrr. Telegram — самый удобный вариант для большинства. Нужен токен бота и chat_id.
Как получить Telegram Bot Token и Chat ID
Создай бота через @BotFather — получишь токен вида 123456789:AAFabc… Потом напиши боту любое сообщение и открой: https://api.telegram.org/bot{TOKEN}/getUpdates — там найдёшь chat id.
services:
watchtower:
image: nickfedor/watchtower:latest
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Europe/Moscow
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_INCLUDE_RESTARTING=true
- WATCHTOWER_POLL_INTERVAL=86400
- WATCHTOWER_NOTIFICATIONS=shoutrrr
- WATCHTOWER_NOTIFICATION_SHOUTRRR_URL=telegram://TOKEN@telegram?channels=CHAT_ID
- WATCHTOWER_NOTIFICATION_REPORT=true
Обновление только выбранных контейнеров
По умолчанию Watchtower обновляет всё что видит. Это не всегда нужно. Два способа ограничить область.
Способ первый — разрешить только помеченные контейнеры. В compose Watchtower добавь переменную:
- WATCHTOWER_LABEL_ENABLE=true
Потом у контейнеров которые хочешь обновлять добавь label:
services:
nginx:
image: nginx:latest
labels:
- "com.centurylinklabs.watchtower.enable=true"
Способ второй — явно исключи контейнеры которые трогать нельзя:
services:
postgres:
image: postgres:15
labels:
- "com.centurylinklabs.watchtower.enable=false"
БД особенно любят такое — накатил новый образ без проверки миграций и получил несовместимость. Базы данных из автообновления исключай всегда.
Запуск по расписанию через cron
Если нужно обновлять строго в определённое время — используй WATCHTOWER_SCHEDULE вместо POLL_INTERVAL. Синтаксис cron, но с секундами в начале.
# Каждое воскресенье в 03:00
- WATCHTOWER_SCHEDULE=0 0 3 * * 0
Вариант 2: Diun — контроль вместо автоматизации
Diun (Docker Image Update Notifier) от CrazyMax делает одно: смотрит на твои образы и сообщает когда вышло обновление. Сам ничего не трогает. Ты решаешь когда обновлять и обновлять ли вообще.
Это именно то что нужно если у тебя есть хоть один контейнер, которого нельзя перезапустить без подготовки. Или если ты хочешь читать changelog перед обновлением. Или если просто не доверяешь автоматике в 3 ночи.
Установка Diun через Docker Compose
services:
diun:
image: crazymax/diun:latest
container_name: diun
restart: unless-stopped
command: serve
volumes:
- ./diun-data:/data
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Europe/Moscow
- LOG_LEVEL=info
- LOG_JSON=false
- DIUN_WATCH_WORKERS=20
- DIUN_WATCH_SCHEDULE=0 */6 * * *
- DIUN_WATCH_JITTER=30s
- DIUN_PROVIDERS_DOCKER=true
- DIUN_PROVIDERS_DOCKER_WATCHBYDEFAULT=true
Запусти и проверь:
docker compose up -d
docker logs diun --tail 30
Подключение уведомлений Telegram к Diun
Diun поддерживает Telegram, Discord, Slack, Matrix, Gotify, Pushover, email и ещё десяток каналов. Telegram — самый быстрый для настройки.
services:
diun:
image: crazymax/diun:latest
container_name: diun
restart: unless-stopped
command: serve
volumes:
- ./diun-data:/data
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TZ=Europe/Moscow
- LOG_LEVEL=info
- DIUN_WATCH_WORKERS=20
- DIUN_WATCH_SCHEDULE=0 */6 * * *
- DIUN_WATCH_JITTER=30s
- DIUN_PROVIDERS_DOCKER=true
- DIUN_PROVIDERS_DOCKER_WATCHBYDEFAULT=true
- DIUN_NOTIF_TELEGRAM_TOKEN=123456789:AAFabc...
- DIUN_NOTIF_TELEGRAM_CHATIDS=-100123456789
Протестируй уведомление не дожидаясь планового запуска:
docker exec diun diun notif test
В Telegram должно прийти тестовое сообщение от бота.
Мониторинг только выбранных контейнеров в Diun
Если WATCHBYDEFAULT=true — Diun следит за всем. Если хочешь только часть контейнеров — выключи флаг и добавляй labels вручную.
- DIUN_PROVIDERS_DOCKER_WATCHBYDEFAULT=false
Потом у нужных контейнеров:
services:
nginx:
image: nginx:latest
labels:
- "diun.enable=true"
Diun умеет следить и за конкретными тегами. Если тебе важно знать когда вышел новый patch-релиз образа с тегом 1.24.x — настрой semver-фильтр через label diun.watch_repo=true.
Сравнение: что выбрать
| Критерий |
nickfedor/watchtower |
crazy-max/diun |
| Что делает |
Обновляет и перезапускает контейнеры |
Только уведомляет об обновлениях |
| Нужно ли руками нажимать |
Нет |
Да |
| Риск даунтайма |
Есть (перезапуск контейнера) |
Нулевой |
| Поддержка Docker 29+ |
Да |
Да |
| Уведомления Telegram |
Да (через shoutrrr) |
Да (нативно) |
| Для homelab без критичного |
Идеально |
Хорошо |
| Для prod или с БД |
Нет |
Да |
| Статус проекта |
Активный форк (личный) |
Активная разработка |
| Совместимость с containrrr |
Полная (drop-in замена) |
Разные инструменты |
Мой рецепт для homelab: Diun для слежения за всеми образами и уведомлений. Watchtower (nickfedor) — только для контейнеров без состояния, которые не жалко перезапустить в любой момент. БД, очереди, всё что хранит данные — только через Diun с ручным обновлением.
Проверка работы
Watchtower
Посмотреть логи и убедиться что нет ошибок API:
docker logs watchtower --tail 50 | grep -E "error|warn|info"
Принудительно запустить проверку прямо сейчас:
docker exec watchtower /watchtower --run-once
Проверить статус контейнера:
docker inspect watchtower | grep -E "Status|RestartCount"
RestartCount выше 2-3 — что-то не так, смотри полные логи.
Diun
Запустить принудительную проверку всех образов:
docker exec diun diun image list
Посмотреть историю обновлений:
docker exec diun diun image inspect --image nginx:latest
Проверить что все контейнеры в мониторинге:
docker logs diun 2>&1 | grep "Cron job"
Осложнения и их лечение
client version 1.25 is too old
Ты используешь containrrr/watchtower. Он заархивирован и не совместим с Docker 29+. Замени образ в docker-compose.yml:
Исправление: замени образ в compose-файле
Найди строку с containrrr/watchtower и замени на nickfedor/watchtower. Больше ничего менять не нужно — конфиг совместим полностью.
# Останови старый контейнер
docker compose down
# Обнови образ в docker-compose.yml:
# image: containrrr/watchtower --> image: nickfedor/watchtower
# Подними заново
docker compose up -d
Watchtower обновил контейнер, приложение не работает
Образ обновился, но что-то сломалось. Вернись на предыдущий образ через тег. Сначала посмотри что сейчас запущено:
docker inspect имя_контейнера | grep Image
Потом в docker-compose.yml замени latest на конкретный тег предыдущей версии и пересоздай контейнер. Урок на будущее: не используй тег latest для критичных сервисов — пиши конкретную версию.
Diun не отправляет уведомления
Проверь токен и chat_id. Chat_id для группового чата начинается с минуса (-100…). Для личного чата — положительное число. Распространённая ошибка — скопировать chat_id без минуса.
Запусти тест:
docker exec diun diun notif test
Если ошибка «Forbidden» — бот не добавлен в чат или заблокирован.
Watchtower не видит приватный реестр
Для приватных реестров нужен docker login перед запуском. Смонтируй конфиг авторизации:
services:
watchtower:
image: nickfedor/watchtower:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /root/.docker/config.json:/config.json:ro
environment:
- DOCKER_CONFIG=/config.json
Diun следит за одним образом, игнорирует остальные
Скорее всего WATCHBYDEFAULT выключен и labels не проставлены. Либо включи WATCHBYDEFAULT=true, либо добавь label diun.enable=true ко всем нужным контейнерам.
Watchtower не чистит старые образы
Добавь переменную WATCHTOWER_CLEANUP=true. По умолчанию старые образы остаются и занимают место. Через неделю активной работы можешь обнаружить, что диск закончился. Капля никотина убивает лошадь, один latest без CLEANUP за месяц съедает 20 гигабайт.
Безопасность: docker.sock и что с ним делать
Оба инструмента монтируют /var/run/docker.sock. Это значит что у контейнера полный доступ к Docker-демону. Если контейнер скомпрометирован — у атакующего root на хосте. Это не паранойя, это факт архитектуры.
Минимальные меры:
- Не запускай Watchtower или Diun из чужих compose-файлов без проверки
- Ограничь сеть контейнера — ему не нужен выход наружу кроме Docker Hub
- Для Diun в режиме только-уведомлений доступ к сокету можно сделать read-only через Docker socket proxy (Tecnativa/docker-socket-proxy)
- Регулярно обновляй сам образ Watchtower или Diun
Схема с socket proxy для Diun — правильный подход для параноиков:
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '15px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart LR
A["Diun"] --> B["Socket Proxy"]
B --> C["docker.sock"]
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style B fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#c2410c
style C fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
services:
socket-proxy:
image: tecnativa/docker-socket-proxy
container_name: socket-proxy
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- CONTAINERS=1
- IMAGES=1
- INFO=1
networks:
- socket-proxy
diun:
image: crazymax/diun:latest
container_name: diun
restart: unless-stopped
command: serve
volumes:
- ./diun-data:/data
environment:
- TZ=Europe/Moscow
- DIUN_WATCH_SCHEDULE=0 */6 * * *
- DIUN_PROVIDERS_DOCKER=true
- DIUN_PROVIDERS_DOCKER_WATCHBYDEFAULT=true
- DIUN_PROVIDERS_DOCKER_ENDPOINT=tcp://socket-proxy:2375
- DIUN_NOTIF_TELEGRAM_TOKEN=TOKEN
- DIUN_NOTIF_TELEGRAM_CHATIDS=CHAT_ID
networks:
- socket-proxy
networks:
socket-proxy:
driver: bridge
Резервное копирование и обновление самих инструментов
Watchtower nickfedor обновляет себя сам — он мониторит собственный образ в том числе. Diun нужно обновлять вручную или добавить Watchtower для мониторинга образа Diun. Да, это выглядит рекурсивно.
Что реально бэкапить:
- docker-compose.yml с переменными (или .env файл рядом)
- Папку diun-data/ — там база с историей образов
- Конфиг авторизации Docker если используешь приватные реестры
Минимальный backup скрипт:
#!/bin/bash
BACKUP_DIR="/backup/docker-tools"
DATE=$(date +%Y%m%d)
mkdir -p "$BACKUP_DIR"
cp /opt/watchtower/docker-compose.yml "$BACKUP_DIR/watchtower-compose-$DATE.yml"
cp -r /opt/diun/diun-data "$BACKUP_DIR/diun-data-$DATE"
Альтернативы: что ещё есть
Если ни Watchtower ни Diun не подходят — вот короткий список:
- What’s Up Docker (WUD) — веб-интерфейс, мониторинг и уведомления, больше возможностей для фильтрации. Тяжелее Diun.
- Portainer — полноценный GUI для Docker. Есть мониторинг обновлений, но основная ценность не в этом.
- Renovate — если ты ведёшь docker-compose.yml в git, Renovate откроет PR с обновлёнными тегами образов. CI/CD рулит.
- Komodo — упоминается в русскоязычном сообществе как альтернатива Watchtower с более широкими возможностями управления.
Для продакшна правильный ответ — Kubernetes с FluxCD или ArgoCD. Там версионирование образов, rolling updates, автооткат. Но это уже другая история и другой уровень сложности.
FAQ
Почему watchtower docker не работает после обновления?
Скорее всего ты используешь официальный containrrr/watchtower, который заархивирован в декабре 2025 и не совместим с Docker 29+. Ошибка в логах: client version 1.25 is too old. Замени образ на nickfedor/watchtower — конфиг совместим полностью, менять кроме имени образа ничего не нужно.
Как проверить что watchtower работает правильно?
Запусти docker logs watchtower —tail 30 и убедись что нет строк с level=error. Должны быть строки Starting Watchtower и Running watchtower без ошибок. Принудительно запустить проверку: docker exec watchtower /watchtower —run-once.
Что делать если watchtower обновил контейнер и всё сломалось?
В docker-compose.yml замени тег latest на конкретную предыдущую версию образа, потом docker compose up -d —force-recreate. На будущее: не используй latest для сервисов с данными, пиши конкретный тег. И исключай БД из автообновления через label com.centurylinklabs.watchtower.enable=false.
Чем diun отличается от watchtower?
Diun только уведомляет о выходе нового образа — сам ничего не обновляет. Watchtower автоматически скачивает новый образ и перезапускает контейнер. Diun безопаснее для продакшна и сервисов с данными: ты решаешь когда и как обновлять. Watchtower удобнее для homelab где важнее автоматизация, а не контроль.
Как настроить docker update notifications в Telegram?
Для Diun: добавь переменные DIUN_NOTIF_TELEGRAM_TOKEN и DIUN_NOTIF_TELEGRAM_CHATIDS в docker-compose.yml. Для Watchtower (nickfedor): переменные WATCHTOWER_NOTIFICATIONS=shoutrrr и WATCHTOWER_NOTIFICATION_SHOUTRRR_URL=telegram://TOKEN@telegram?channels=CHAT_ID. Протестируй командой docker exec diun diun notif test.
Можно ли использовать watchtower в продакшне?
Сам проект так не рекомендует: в документации написано «intended for homelabs, media centers, local dev environments». В продакшне автоматический перезапуск контейнеров без тестирования и согласования — это путь к инцидентам. Используй Diun для уведомлений, обновляй через CI/CD с rollback-планом.
Итог
containrrr/watchtower умер в декабре 2025. Не трогай его — он не совместим с текущими версиями Docker и обновлений не будет.
Для homelab без критичных данных: nickfedor/watchtower — drop-in замена, работает сразу, меняешь одну строку в compose-файле. Для всего остального, где важен контроль над тем что и когда обновляется: Diun с Telegram-уведомлениями. Ты видишь что вышло, читаешь changelog, обновляешь когда готов.
Не заработало?
Пиши в комментарии — покажи вывод docker logs watchtower и версию Docker (docker version). Разберёмся.