Corriger les volumes temporaires avec les volumes Docker !
Voici un problème que je trouve pas assez bien documenté sur les images Docker officielles de certains éditeurs ! C'est un problème que j'ai rencontré, pour la création de ce blog même.
Volume managé
Un volume Docker managé permet de laisser le Docker Engine monter un volume qui se trouvera dans /var/lib/docker
Par exemple, dans un docker-compose, si on veut monter un volume pour les logs de notre conteneur Nginx, on effectuera cela :
Petit rappel, pour connaître le répertoire du volume nginx-logs
, il suffit d'éxecuter la commande suivante :
docker volume inspect nginx-logs
Avec la version filtrée :
docker volume inspect -f={{.Mountpoint}} nginx-logs
Maintenant, cela peut poser le souci suivant. Si dans le Dockerfile
de l'image utilisée, la séquence VOLUME
est utilisée, alors, le conteneur ira automatiquement essayer de déposer des fichiers dans le répertoire de ce volume.
Or, si aucun volume n'est monté dans ce répertoire, vous allez vous retrouver avec plein de volumes temporaires (crées à chaque docker-compose up
) comme ceci :
C'était le cas avec l'image Docker pour le CMS Ghost utilisé pour ce blog.
Problème causé
Le problème causé est tout simplement que lorsque j'effectuais un docker-compose down
puis un docker-compose up -d
, les images disparaissaient car elles étaient stockées dans ces layers temporaires.
J'ai pu le détecter avec la commande locate
suivi du nom d'une image png, et voir que l'image était stockée dans un volume temporaire. Et également, en inspectant le conteneur ghost, j'ai pu voir qu'un 2e volume était monté :
Vérification
Pour vérifier si la séquence VOLUME
est utilisée dans le Dockerfile
, il faut se rendre sur le Docker Hub ou sur la registry depuis laquelle l'image a été pull et analyser les layers de l'image.
Nous pouvons voir qu'au layer 21 de l'image, le Volume est monté sur le répertoire /var/lib/ghost/content
Correction
Pour corriger ce souci et ne plus se retrouver avec des fichiers présents sur des volumes temporaires, il faut tout simplement monter le même volume que dans le Dockerfile
de l'image.
Voici un exemple de docker-compose
pour Ghost avec 2 volumes montés :
ghost:
image: ghost
restart: unless-stopped
container_name: ghost
hostname: ghost
env_file: .env
volumes:
- ghost:/var/lib/ghost
- ghost-content:/var/lib/ghost/content
networks:
- ghost
volumes:
ghost:
ghost-content:
On se retrouvera avec nos fichiers dans les volumes ghost
et ghost-content
et non pas sur le volume 3d19d025de210a76f6ecc885f524e8c040028b17e900d0624c13599e5695badc par exemple :)