Инфраструктура на основе Docker – это удобно, особенно если вы используете подход «инфраструктура как код». Но вместе с плюсами появляются и минусы – все это хозяйство требуется поддерживать в актуальном состоянии и регулярно обновлять.
Можно, конечно, делать это руками, но зачем, когда можно автоматизировать этот процесс. Для этого мы будем использовать Watchtower – простой и удобный инструмент, который будет отслеживать состояние ваших контейнеров и обновлять их по мере выхода новых версий.
Для его использования вам потребуется еще один небольшой контейнер, который можно развернуть при помощи следующего
docker-compose.yml:services:
watchtower:
image: nickfedor/watchtower:latest
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_REMOVE_VOLUMES=true
- WATCHTOWER_POLL_INTERVAL=86400
- DOCKER_API_VERSION=1.40
- WATCHTOWER_LABEL_ENABLE=true
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
Коротко пробежимся по некоторым опциям:
🔹 WATCHTOWER_CLEANUP - удаляет старые образы после обновления
🔹 WATCHTOWER_REMOVE_VOLUMES - удаляет старые анонимные тома
🔹 WATCHTOWER_POLL_INTERVAL - интервал проверки обновлений, в нашем случае - сутки
Перед включением этих опций, особенно второй, убедитесь, что вы понимаете что делаете.
Но обновлять все подряд без разбора – плохая идея. Поэтому мы рекомендуем в продуктивных средах использовать включенным параметр:
🔹 WATCHTOWER_LABEL_ENABLE – включает режим обновления по меткам
Теперь для того, чтобы Watchtower отслеживал и обновлял контейнер к нему следует добавить метку:
labels:
- "com.centurylinklabs.watchtower.enable=true"
Таким образом мы можем четко контролировать что именно мы обновляем, особенно если у нас есть какие-либо критичные сервисы, которые лучше протестировать перед обновлением.
Кстати, для них есть другая полезная метка:
labels:
- "com.centurylinklabs.watchtower.enable=false"
Которая явно предписывает Watchtower игнорировать данный контейнер. Это нужно для тех случаев, если вы вдруг измените режим работы на:
WATCHTOWER_LABEL_ENABLE=false
В этом случае автоматически обновляются все контейнеры, кроме имеющих метку
enable=false, что служит надежным предохранителем от нештатной ситуации.
