Watchtower, garder ses docker container à jour

Posted on mar. 19 mars 2019 in adminsys

Garder ses soft tournant avec Docker à jour

Docker, c'est chouette. On peut faire tourner en totale autarcie n'importe quelle logiciel. Plus besoin de dédier une VM à un serveur applicatif.

Problème : comment on fait pour garder tout ça à jour. En effet, dans le cas "VM", un apt update && apt upgrade ou un yum update suffit dans la plupart des cas. C'est toujours valable pour les serveurs sur lesquels tournent docker, ainsi que pour le daemon docker lui-même, mais pour les soft tournant sous docker ?

Jusque là, je le faisais à la main : je récupèrais le flux RSS des releases (sur github ou sur le gitlab ou sur le blog sur soft) dans mon super lecteur de flux RSS autohébergé. Et quand une nouvelle release arrivait, j'exécutais à la main (ou via ansible) docker stop MonServiceHerberge && docker pull editeur/mon_service_herberge:latest && docker run --blablabla MonServiceHeberge.

Quand on a 2 ou 3 services hébergés, c'est encore gérable, mais quand on en a plusieurs dizaines et qu'en plus, ils ont chacun plusieurs briques (au hasard, nginx, par exemple), ça devient plus long à s'en occuper. Et je ne parle même pas des mises-à-jour des layers dockers. Alpine linux pour ne citer que lui.

Watchtower

Et c'est là que j'ai découvert Watchtower.

Je vous copie-colle sa description :

A process for watching your Docker containers and automatically restarting them whenever their base image is refreshed.

Belle promesse ! et en plus, on peut le déployer dans un docker.

Ok, comment ça marche ? Repompons sans vergogne la documentation officielle :

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

Et concrêtement

Personnellement, en plus de serveurs git/jenkins/... codés par d'autres, j'héberge également des trucs que j'ai créé moi-même et que je mets moi-même à jour régulièrement. Et j'ai pu observé watchtower interférer dans ces derniers, les arrêter sans les redémarrer, etc..., alors qu'il est sans problème sur les images dockers récupérées depuis DockerHub.

Voici donc la configuration que j'utilise (codé dans ansible, non mais) :

docker run -d \
  --name Watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --label=com.centurylinklabs.watchtower.enable=true
  v2tec/watchtower --cleanup --label-enable -s '@weekly'

Avec les variables d'environnement qui vont bien pour recevoir un rapport par e-mail à chaque update de docker. Ca lancera une vérification par semaine sur les docker containers qui ont le bon label (com.centurylinklabs.watchtower.enable=true) et il fera un peu de ménage dans les images qui ne sont plus utilisées.

Il ne me reste plus qu'à rajouter le label com.centurylinklabs.watchtower.enable=true à tous les docker containers dont je veux la mise-à-jour automatique. Les autres, ne seront pas toucher.

Ca me permet d'avoir l'esprit tranquille : j'ai des nextcloud, jenkins, gitea, openvpn, traefik, etc... qui sont toujours à jour. Et ça, c'est top !