Corriger les volumes temporaires avec les volumes Docker !

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 :

  nginx:
    image: nginx
    ports:
      - 80:80
    volumes:
      - nginx-logs:/var/log/nginx
  
  volumes:
    nginx-logs:
Exemple de docker-compose pour Nginx avec volume managé

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