Blog & Astuces

Mettre à jour automatiquement ses containers Docker avec Watchtower

Mettre à jour automatiquement ses containers Docker avec Watchtower

Tuto

Dans cet article, nous allons voir comment mettre en place Watchtower pour mettre à jour automatiquement ses containers Docker.

Pré-requis

  • Un serveur Linux avec Docker installé

Introduction

Watchtower est un petit outil fonctionnant avec Docker et analysant les containers Docker lancés pour vérifier si une mise à jour de leur image est disponible. Si c'est le cas, la nouvelle image est téléchargée puis le container est mis à jour avec la nouvelle image.

Watchtower ne fonctionne qu'en prenant en compte le tag de l'image utilisée, et fonctionne mieux avec les tags de type latest qu'avec les tags de version.

Mise en place de Watchtower

Créer un nouveau fichier docker-compose.yml dans un nouveau dossier, avec le contenu suivant :

version: "3"
services:
  watchtower:
    image: containrrr/watchtower:latest
    container_name: watchtower
    restart: unless-stopped
    environment:
      - WATCHTOWER_POLL_INTERVAL=300
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_INCLUDE_RESTARTING=true
      - WATCHTOWER_LOG_LEVEL=error
      - WATCHTOWER_HTTP_API_METRICS=false
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro

Voici l'explication des différents éléments de configuration :

  • WATCHTOWER_POLL_INTERVAL : l'intervalle de vérification des mises à jour des containers, ici paramétrée à 5 minutes (300 secondes)
  • WATCHTOWER_CLEANUP : supprime automatiquement les anciennes images inutilisées suite à la mise à jour d'un container, ici activé
  • WATCHTOWER_INCLUDE_RESTARTING : redémarre les containers lors de leur mise à jour, ici activé
  • WATCHTOWER_LOG_LEVEL : le niveau du log d'erreurs, ici on log le niveau erreur au maximum
  • WATCHTOWER_HTTP_API_METRICS : active ou désactive l'API de metrics (qui permet à Prometheus de récupérer certains infos sur le fonctionnement de Watchtower par exemple)

Démarrez le container avec docker-compose up -d puis vérifiez que tout est OK avec les logs : docker container logs watchtower.

Configuration optionnelle

Si vous avez des images qui sont sur un registry Docker privé, vous devrez mdofier ou créer un fichier de configuration particulier avec vos clés de connexion. Ce fichier se nomme config.json et se trouve dans un dossier .docker dans votre dossier home.

Le contenu ressemblera à ça pour se connecter aux registries privés :

{
    "auths": {
        "secret-registry.domain.com": {
            "auth": "CLE_AUTHENT"
        }
    }
}

secret-registry.domain.com correspond au domaine de votre registry. Quant à la clé d'authentification, elle peut être obtenue avec la commande docker login. Plus d'infos ici.

Ajoutez ce fichier aux volumes de Watchtower. Exemple :

version: "3"
services:
  watchtower:
    image: containrrr/watchtower:latest
    (le reste de la config)
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /home/USERNAME/.docker/config.json:/config.json

Bien sûr, modifiez le USERNAME.

Bloquer la vérification et la mise à jour de certains containers

Vous pourrez vouloir bloquer l'analyse et la mise à jour automatique de certains containers sensibles par Watchtower. En effet, il peut arriver que des nouvelles versions des images introduisent un bug ou une régression, ou alors que le container ne démarre plus.

Pour cela, il faut ajouter les lignes suivantes dans le fichier docker-compose.yml du container :

version: "3"
services:
    monContainer:
        (reste de la config)
        labels:
           - "com.centurylinklabs.watchtower.enable=false"

La ligne labels et - "com.centurylinklabs.watchtower.enable=false" ont été ajoutées pour bloquer la mise à jour par Watchtower.

Incovénients de cette méthode

L'inconvénient principal que j'ai rencontré est justement le cas où les nouvelles versions des images introduisent un bug, une régression ou une modification de la configuration qui fait que le container ne démarre plus. Le container devient donc inopérant.

De plus, la mise à jour n'est plus maîtrisée par vous mais par un outil automatisé qui tourne à intervalles réguliers. Un service peut donc tomber en panne de manière aléatoire.

Je continue personnellement d'utiliser Watchtower pour certains containers, ou alors pour ma partie CI/CD pour déployer automatiquement des images de containers que je maîtrise (depuis mon registry privé). Pour les autres cas, mes containers restent à des versions fixées et j'utilise un script que j'ai écrit pour vérifier les mises à jour régulièrement et les appliquer à la main.

Conclusion

En conclusion, l'utilisation de Watchtower pour automatiser la mise à jour des containers Docker présente des avantages indéniables en termes de maintenance et de gestion des versions, mais peut également entraîner des risques, notamment en cas de bugs ou de régressions introduits par les mises à jour automatiques. Il faut donc peser attentivement les avantages et les inconvénients, et adopter une approche adaptée à chaque cas d'utilisation, en combinant éventuellement l'automatisation avec une supervision manuelle pour garantir la stabilité et la fiabilité du système.

Commentaires