Comment utiliser plusieurs contextes de construction Docker pour rationaliser l'assemblage d'images
Agence web » Actualités du digital » Comprendre l’instruction Dockerfile VOLUME

Comprendre l’instruction Dockerfile VOLUME

Les volumes Docker sont utilisés pour stocker des données persistantes en dehors de vos conteneurs. Ils permettent aux fichiers de configuration, aux bases de données et aux caches utilisés par votre application de survivre aux instances de conteneur individuelles.

Les volumes peuvent être montés lorsque vous démarrez des conteneurs avec le docker run commande -v drapeau. Cela peut faire référence à un volume nommé ou lier le montage d’un répertoire hôte dans le système de fichiers du conteneur.

Il est également possible de définir des volumes au moment de la construction de l’image en utilisant le VOLUME instruction dans vos Dockerfiles. Ce mécanisme garantit que les conteneurs démarrés à partir de l’image auront un stockage persistant disponible. Dans cet article, vous apprendrez à utiliser cette instruction et les cas d’utilisation où cela a du sens.

Définir des volumes dans Dockerfiles

Le Dockerfile VOLUME L’instruction crée un point de montage de volume sur un chemin de conteneur spécifié. Un volume sera monté à partir du système de fichiers de votre hôte Docker à chaque démarrage d’un conteneur.

Le Dockerfile dans l’exemple suivant définit un volume au /opt/app/data chemin du conteneur. Les nouveaux conteneurs monteront automatiquement un volume dans le répertoire.

FROM ubuntu:22.04
VOLUME /opt/app/data

Créez votre image afin de pouvoir tester le montage du volume :

$ docker build -t volumes-test:latest .

Récupérez la liste des volumes existants comme référence :

$ docker volume ls
DRIVER   VOLUME NAME
local    demo-volume

Démarrez maintenant un conteneur à l’aide de votre image de test :

$ docker run -it volume-test:latest
root@07be7bde68c2:/#

Répétez le docker volume ls commande pour confirmer qu’un nouveau volume a été créé :

$ docker volume ls
DRIVER   VOLUME NAME
local    3198bf857fdcbb8758c5ec7049f2e31a40b79e329f756a68725d83e46976b7a8
local    demo-volume

Quittez le shell de votre conteneur de test pour que le conteneur s’arrête :

root@07be7bde68c2:/# exit
exit

Le volume et ses données continueront à persister :

$ docker volume ls
DRIVER   VOLUME NAME
local    3198bf857fdcbb8758c5ec7049f2e31a40b79e329f756a68725d83e46976b7a8
local    demo-volume

Vous pouvez définir plusieurs volumes dans une instruction sous la forme d’une chaîne délimitée par des espaces ou d’un tableau JSON. Les deux formulaires suivants créent et montent deux volumes uniques au démarrage des conteneurs :

VOLUME /opt/app/data /opt/app/config
# OR
VOLUME ["/opt/app/data", "/opt/app/config"]

Remplir le contenu du volume initial

Les volumes sont automatiquement remplis avec le contenu placé dans le répertoire de montage par les étapes de création d’image précédentes :

FROM ubuntu:22.04
COPY default-config.yaml /opt/app/config/default-config.yaml
VOLUME /opt/app/config

Ce Dockerfile définit un volume qui sera initialisé avec l’existant default-config.yaml dossier. Le conteneur pourra lire /opt/app/config/default-config.yaml sans avoir à vérifier si le fichier existe.

Modifications apportées au contenu d’un volume après la VOLUME l’instruction sera rejetée. Dans cet exemple, le default-config.yaml le fichier est toujours disponible après le démarrage des conteneurs, car le rm la commande vient après /opt/app/config est marqué comme un volume.

FROM ubuntu:22.04
COPY default-config.yaml /opt/app/config/default-config.yaml
VOLUME /opt/app/config
RUN rm /opt/app/config/default-config.yaml

Remplacement des instructions VOLUME lors du démarrage d’un conteneur

Volumes créés par le VOLUME Les instructions sont automatiquement nommées avec un long hachage unique. Il n’est pas possible de changer leurs noms, il peut donc être difficile d’identifier les volumes activement utilisés par vos conteneurs.

Vous pouvez empêcher l’apparition de ces volumes en définissant manuellement des volumes sur vos conteneurs avec docker run -v comme d’habitude. La commande suivante monte explicitement un volume nommé sur le conteneur /opt/app/config répertoire, rendant le Dockerfile VOLUME instruction redondante.

$ docker run -it -v config:/opt/app/config volumes-test:latest

Quand devez-vous utiliser les instructions VOLUME ?

VOLUME Les instructions peuvent être utiles dans les situations où vous souhaitez imposer l’utilisation de la persistance, comme dans les images qui conditionnent un serveur de base de données ou un magasin de fichiers. Utilisant VOLUME les instructions facilitent le démarrage des conteneurs sans se souvenir de la -v drapeaux à appliquer.

VOLUME sert également de documentation des chemins de conteneur qui stockent les données persistantes. L’inclusion de ces instructions dans votre Dockerfile permet à quiconque de déterminer où votre conteneur conserve ses données, même s’il n’est pas familier avec votre application.

VOLUME Pièges

VOLUME n’est pas sans inconvénients. Son plus gros problème est la façon dont il interagit avec les constructions d’images. Utiliser une image avec un VOLUME car l’image de base de votre build se comportera de manière inattendue si vous modifiez le contenu dans le point de montage du volume.

Le piège de tout à l’heure s’applique toujours : les effets des commandes après le VOLUME l’instruction sera rejetée. Comme VOLUME résidera dans l’image de base, tout ce qui se trouve dans votre propre Dockerfile vient après l’instruction et vous ne pouvez pas modifier le contenu par défaut du répertoire. Dans les coulisses, le démarrage du conteneur temporaire pour la construction créera un nouveau volume sur votre hôte qui sera détruit à la fin de la construction. Les modifications ne seront pas copiées dans l’image de sortie.

Le montage automatique du volume peut également être problématique dans d’autres situations. Parfois, les utilisateurs peuvent préférer démarrer un conteneur temporaire sans aucun volume, peut-être à des fins d’évaluation ou de débogage. VOLUME supprime cette possibilité car il n’est pas possible de désactiver les montages automatiques. Cela entraîne l’accumulation de nombreux volumes redondants sur l’hôte si les conteneurs qui utilisent l’instruction sont régulièrement démarrés.

Sommaire

Fichier Docker VOLUME Les instructions permettent de définir les montages de volume au moment de la création de l’image. Ils garantissent que les conteneurs démarrés à partir de l’image auront un stockage de données persistant disponible, même si l’utilisateur omet le docker run commande -v drapeau.

Ce comportement peut être utile pour les images où la persistance est critique ou où de nombreux volumes sont nécessaires. Cependant, le VOLUME L’instruction rompt également certaines attentes des utilisateurs et introduit des comportements uniques, elle doit donc être écrite avec soin. Fournir un fichier Docker Compose qui crée automatiquement les volumes requis est souvent une meilleure solution.

★★★★★