Watchtower is a Docker container that automatically updates your running containers whenever a new image is available. It checks Docker Hub or your image registry periodically and applies updates safely. This ensures your services stay up to date without manual intervention. It’s configurable to ignore specific containers or trigger scripts after updates. A must-have tool for automating container maintenance.
Setup
docker-compose.yaml (email)
version: "3"
networks:
docker_net:
external: true
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /etc/localtime:/etc/localtime:ro
environment:
WATCHTOWER_MONITOR_ONLY: true
WATCHTOWER_SCHEDULE: "0 0 8 ? * SUN"
WATCHTOWER_CLEANUP: true
WATCHTOWER_NOTIFICATION_EMAIL_FROM: $FROM_EMAIL
WATCHTOWER_NOTIFICATION_EMAIL_TO: $TO_EMAIL
WATCHTOWER_NOTIFICATION_EMAIL_SERVER: smtp.gmail.com
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT: 587
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER: $FROM_EMAIL
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD: $GMAIL_APP_PASSWORD
WATCHTOWER_NOTIFICATION_EMAIL_DELAY: 30
WATCHTOWER_NOTIFICATIONS: email
networks:
- docker_net
docker-compose.yaml (email, auto update)
version: "3"
networks:
docker_net:
external: true
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /etc/localtime:/etc/localtime:ro
environment:
WATCHTOWER_SCHEDULE: "0 0 * * *"
WATCHTOWER_CLEANUP: true
WATCHTOWER_NOTIFICATION_EMAIL_FROM: $FROM_EMAIL
WATCHTOWER_NOTIFICATION_EMAIL_TO: $TO_EMAIL
WATCHTOWER_NOTIFICATION_EMAIL_SERVER: smtp.gmail.com
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT: 587
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER: $FROM_EMAIL
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD: $GMAIL_APP_PASSWORD
WATCHTOWER_NOTIFICATION_EMAIL_DELAY: 30
WATCHTOWER_NOTIFICATIONS: email
networks:
- docker_net
docker-compose.yaml (discord webhook)
version: "3"
networks:
docker_net:
external: true
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /etc/localtime:/etc/localtime:ro
environment:
WATCHTOWER_MONITOR_ONLY: true
WATCHTOWER_SCHEDULE: "0 0 8 ? * SUN"
WATCHTOWER_CLEANUP: true
WATCHTOWER_NOTIFICATIONS: slack
WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL: $DISCORD_WEBHOOK_URL # add '/slack' at the end
networks:
- docker_net
docker-compose.yaml (discord webhook, auto update)
version: "3"
networks:
docker_net:
external: true
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /etc/localtime:/etc/localtime:ro
environment:
WATCHTOWER_SCHEDULE: "0 0 8 ? * SUN"
WATCHTOWER_CLEANUP: true
WATCHTOWER_NOTIFICATIONS: slack
WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL: $DISCORD_WEBHOOK_URL # add '/slack' at the end
networks:
- docker_net