Conteneurisation

Watchtower : Mettre à jour automatiquement vos conteneurs Docker

Gérer manuellement les mises à jour de conteneurs Docker peut vite devenir fastidieux, surtout en production avec de nombreux services.

Alban Mary6 min de lecture

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.

(Info)

Quel Watchtower utiliser ? Le projet original containrrr/watchtower n'est plus activement maintenu. Le fork nickfedor/watchtower prend le relais avec des corrections de bugs et des mises à jour régulières. C'est celui que nous utilisons dans cet article.

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 :

bash
$ docker run -d \
  --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  nickfedor/watchtower:latest

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.

(Attention)

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 :

yaml
services:
  watchtower:
    image: nickfedor/watchtower:latest
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - WATCHTOWER_POLL_INTERVAL=300         # Vérification toutes les 5 minutes
      - WATCHTOWER_CLEANUP=true              # Supprime les anciennes images
      - WATCHTOWER_LABEL_ENABLE=true         # Surveille uniquement les conteneurs avec le label enable=true

Puis lancez-le :

bash
$ 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) :

yaml
environment:
  - WATCHTOWER_POLL_INTERVAL=3600  # Toutes les heures

Vous pouvez aussi utiliser une expression cron avec WATCHTOWER_SCHEDULE :

yaml
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 :

yaml
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 :

yaml
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 :

yaml
environment:
  - WATCHTOWER_LABEL_ENABLE=true  # Surveille uniquement les conteneurs avec enable=true

(Danger)

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 :

bash
$ docker login registry.example.com

Puis montez le fichier de configuration dans le conteneur Watchtower :

yaml
services:
  watchtower:
    image: nickfedor/watchtower:latest
    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

yaml
environment:
  - REPO_USER=mon-utilisateur
  - REPO_PASS=mon-mot-de-passe

(Attention)

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

yaml
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)

yaml
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 :

yaml
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 :

yaml
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 :

yaml
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 :

bash
$ docker run --rm \
  -v /var/run/docker.sock:/var/run/docker.sock \
  nickfedor/watchtower:latest --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 :

yaml
services:
  watchtower:
    image: nickfedor/watchtower:latest
    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_POLL_INTERVAL=300       # Vérification toutes les 5 minutes
      - 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

(Info)

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 :

  • nickfedor/watchtower sur GitHub — le fork activement maintenu
  • Coupler Watchtower à un système de registry privé comme Harbor ou GitLab Container Registry pour un pipeline de déploiement continu complet.
$ whoami
Alban MaryIngénieur systèmes & réseaux en alternance chez Epsight, étudiant à l'EPSI Nantes. J'écris ici ce que je mets en place.
(Commentaires)

Nom et commentaire publiés après modération, email jamais affiché. Politique de confidentialité

Chargement…