Retour au blog
Conteneurisation

Watchtower : Mettre à jour automatiquement vos conteneurs Docker

Découvrez comment utiliser Watchtower pour automatiser la mise à jour de vos conteneurs Docker. Plus besoin de redéployer manuellement : Watchtower surveille vos images et recrée vos conteneurs dès qu'une nouvelle version est disponible.

Alban Mary23 mars 20266 min read

Watchtower : Mettre à jour automatiquement vos conteneurs Docker

Objectif

Gérer manuellement les mises à jour de conteneurs Docker peut vite devenir fastidieux, surtout en production avec de nombreux services. Watchtower est un outil open source qui surveille vos conteneurs en cours d'exécution et les met automatiquement à jour dès qu'une nouvelle version de leur image est publiée sur le registry.

Dans cet article, nous allons voir comment déployer et configurer Watchtower, gérer les notifications et adopter les bonnes pratiques pour une utilisation sereine en production.


Prérequis

  • Docker installé et fonctionnel sur votre hôte
  • Accès à un terminal avec les droits suffisants (groupe docker ou sudo)
  • (Optionnel) Docker Compose pour une configuration déclarative

Démarrage rapide

La façon la plus simple de lancer Watchtower est d'utiliser docker run :

docker run -d \
  --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  containrrr/watchtower

Que fait cette commande ?

  • Lance Watchtower en arrière-plan (-d).
  • Monte le socket Docker (/var/run/docker.sock) pour que Watchtower puisse interroger et contrôler le daemon Docker local.
  • Par défaut, Watchtower vérifie les mises à jour toutes les 24 heures et met à jour tous les conteneurs en cours d'exécution.
Monter le socket Docker donne à Watchtower un accès complet au daemon. Pensez à restreindre les conteneurs surveillés si vous partagez l'hôte avec des services sensibles.

Déploiement avec Docker Compose

Pour une configuration plus maintenable, intégrez Watchtower dans votre fichier docker-compose.yml :

services:
  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - WATCHTOWER_POLL_INTERVAL=3600        # Vérification toutes les heures
      - WATCHTOWER_CLEANUP=true              # Supprime les anciennes images
      - WATCHTOWER_INCLUDE_STOPPED=false     # Ignore les conteneurs stoppés
      - TZ=Europe/Paris

Puis lancez-le :

docker compose up -d

Options essentielles

Intervalle de vérification

Par défaut : 86400 secondes (24h). Pour changer l'intervalle, utilisez la variable WATCHTOWER_POLL_INTERVAL (en secondes) :

environment:
  - WATCHTOWER_POLL_INTERVAL=3600  # Toutes les heures

Vous pouvez aussi utiliser une expression cron avec WATCHTOWER_SCHEDULE :

environment:
  - WATCHTOWER_SCHEDULE=0 0 4 * * *  # Tous les jours à 4h du matin

Nettoyage automatique des images

Après mise à jour, les anciennes images restent sur le disque. Activez le nettoyage automatique :

environment:
  - WATCHTOWER_CLEANUP=true

Surveillance sélective des conteneurs

Par défaut, Watchtower surveille tous les conteneurs. Pour ne surveiller que certains d'entre eux, utilisez des labels dans vos services :

services:
  mon-app:
    image: mon-registry/mon-app:latest
    labels:
      - "com.centurylinklabs.watchtower.enable=true"

  base-de-donnees:
    image: postgres:16
    labels:
      - "com.centurylinklabs.watchtower.enable=false"  # Exclure ce conteneur

Activez ensuite le mode opt-in dans Watchtower :

environment:
  - WATCHTOWER_LABEL_ENABLE=true  # Surveille uniquement les conteneurs avec enable=true
En production, il est fortement recommandé d'exclure les bases de données et les services à état (stateful) de la surveillance automatique pour éviter des pertes de données lors de mises à jour de schéma non anticipées.

Registries privés

Si vos images sont hébergées sur un registry privé (Docker Hub privé, Harbor, GitLab Registry, GHCR…), vous devez fournir les identifiants à Watchtower.

Via un fichier de configuration Docker

Connectez-vous d'abord avec docker login sur votre hôte :

docker login registry.example.com

Puis montez le fichier de configuration dans le conteneur Watchtower :

services:
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /root/.docker/config.json:/config.json
    environment:
      - DOCKER_CONFIG=/config.json

Via des variables d'environnement

environment:
  - REPO_USER=mon-utilisateur
  - REPO_PASS=mon-mot-de-passe
Préférez toujours un fichier `config.json` ou un secret Docker plutôt que de stocker vos mots de passe en clair dans un fichier Compose versionné.

Notifications

Watchtower peut vous notifier à chaque mise à jour via plusieurs canaux.

Notification par e-mail

environment:
  - WATCHTOWER_NOTIFICATIONS=email
  - WATCHTOWER_NOTIFICATION_EMAIL_FROM=watchtower@example.com
  - WATCHTOWER_NOTIFICATION_EMAIL_TO=admin@example.com
  - WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.example.com
  - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587
  - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=smtp-user
  - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=smtp-password

Notification via Slack (ou tout webhook)

environment:
  - WATCHTOWER_NOTIFICATIONS=slack
  - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL=https://hooks.slack.com/services/XXX/YYY/ZZZ
  - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-prod

Watchtower supporte aussi Gotify, Shoutrrr, MSTeams et d'autres systèmes de notification via l'intégration Shoutrrr.


Bonnes pratiques

Utiliser des tags de version plutôt que latest

Watchtower fonctionne en comparant le digest de l'image locale avec celui disponible sur le registry. Si vous utilisez le tag latest, toute nouvelle publication déclenchera une mise à jour. Pour plus de contrôle, pointez sur un tag de version mineure et gérez vous-même la montée de version majeure :

image: nginx:1.27  # Watchtower mettra à jour les patchs de 1.27.x

Mode monitoring seul

Pour auditer sans toucher à rien, activez le mode lecture seule :

environment:
  - WATCHTOWER_MONITOR_ONLY=true

Watchtower détectera les mises à jour disponibles et enverra des notifications sans redémarrer aucun conteneur. Idéal pour commencer progressivement.

Délai de démarrage des conteneurs

Après la recréation d'un conteneur, Watchtower peut attendre un délai avant de passer au suivant, pour éviter des cascades de redémarrages :

environment:
  - WATCHTOWER_TIMEOUT=30s  # Attend 30 secondes avant de stopper l'ancien conteneur

Exécution unique (one-shot)

Pour déclencher une vérification manuelle et ponctuelle sans laisser Watchtower tourner en permanence :

docker run --rm \
  -v /var/run/docker.sock:/var/run/docker.sock \
  containrrr/watchtower --run-once

Cela peut s'intégrer dans un pipeline CI/CD pour déclencher les mises à jour après un push.


Exemple complet docker-compose.yml

Voici un fichier docker-compose.yml prêt à l'emploi réunissant les options les plus utiles :

services:
  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /root/.docker/config.json:/config.json
    environment:
      - DOCKER_CONFIG=/config.json
      - WATCHTOWER_SCHEDULE=0 0 3 * * *   # Chaque nuit à 3h
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_NOTIFICATIONS=slack
      - WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL=${SLACK_WEBHOOK_URL}
      - WATCHTOWER_NOTIFICATION_SLACK_IDENTIFIER=watchtower-prod
      - TZ=Europe/Paris
Stockez vos variables sensibles (`SLACK_WEBHOOK_URL`, mots de passe SMTP…) dans un fichier `.env` jamais commité, ou utilisez les secrets de votre orchestrateur.

Conclusion

Watchtower est un outil simple mais puissant pour maintenir vos conteneurs à jour sans intervention manuelle. Grâce à ses nombreuses options, surveillance sélective par labels, planification cron, notifications multi-canaux et mode monitoring seul, il s'adapte aussi bien aux environnements homelab qu'aux infrastructures de production.

Pour aller plus loin :

  • Documentation officielle Watchtower
  • Coupler Watchtower à un système de registry privé comme Harbor ou GitLab Container Registry pour un pipeline de déploiement continu complet.
AM

Alban Mary

Développeur Web & Administrateur Systèmes — Étudiant à l'EPSI Nantes. Je partage ici mes connaissances sur l'infra, le dev et la cybersécurité.

Commentaires

Laisser un commentaire

Commentaires publiés

Chargement...