Quel est le but de VOLUME dans Dockerfile

106

J'essaie d'approfondir ma compréhension du volume de Docker, et j'ai du mal à comprendre les différences / cas d'utilisation de:

  • La docker volume createcommande
  • le docker run -v /path:/host_path
  • L' VOLUMEentrée dans le Dockerfilefichier

Je ne comprends particulièrement pas ce qui se passe si vous combinez l' VOLUMEentrée avec le -vdrapeau.

radium226
la source
1
En relation: stackoverflow.com/a/46992367/3160529
Shubham

Réponses:

70

Un volume est une donnée persistante stockée dans /var/lib/docker/volumes/...

  • Vous pouvez soit le déclarer dans un Dockerfile, ce qui signifie qu'à chaque fois qu'un conteneur est démarré à partir de l'image, le volume est créé ( vide ), même si vous n'avez aucune -voption.

  • Vous pouvez le déclarer à l'exécution docker run -v [host-dir:]container-dir.
    la combinaison des deux ( VOLUME+ docker run -v) signifie que vous pouvez monter le contenu d'un dossier hôte dans votre volume conservé par le conteneur dans/var/lib/docker/volumes/...

  • docker volume create crée un volume sans avoir à définir un Dockerfile, à créer une image et à exécuter un conteneur. Il est utilisé pour permettre rapidement à d'autres conteneurs de monter ledit volume.

Si vous aviez conservé du contenu dans un volume, mais que vous avez depuis supprimé le conteneur (qui par défaut ne supprime pas son volume associé, sauf si vous utilisez docker rm -v), vous pouvez rattacher ledit volume à un nouveau conteneur (en déclarant le même volume).

Voir « Docker - Comment accéder à un volume non attaché à un conteneur? ».
Avec la création de volume de docker, il est facile de rattacher un volume nommé à un conteneur.

docker volume create --name aname
docker run -v aname:/apath --name acontainer
...
# modify data in /apath
...
docker rm acontainer

# let's mount aname volume again
docker run -v aname:/apath --name acontainer
ls /apath
# you find your data back!
VonC
la source
2
Disons que vous utilisez un Dockerfileavec VOLUMEet le -v /path:/host_path/drapeau. Le contenu du VOLUMEtestament sera remplacé par le contenu de /host_path/?
radium226
Merci à vous @VonC, je pense que je comprends :) Et si vous faites un docker volume create --name my_volumesuivi d'un docker run --volume-from my_volume, comment savez-vous où sera le point de montage?
radium226
@ radium226 pas de point de montage (ce qui signifie que rien n'est monté depuis l'hôte, à côté du vide natif / var / lib / docker / volume). Le chemin du volume se trouve dans les métadonnées my_volume: stackoverflow.com/a/31997267/6309
VonC
Je comprends qu'il n'y a pas de point de montage du côté hôte. Mais dans le conteneur en cours d'exécution lancé avec docker run ..., comment puis-je écrire dans un fichier stocké sur le my_volumevolume? Je ne connais pas le ... chemin? du volume à l'intérieur de mon conteneur en cours d'exécution parce que je n'ai rien défini? J'espère que je suis assez clair, car je ne suis certainement pas sûr de ma vocable: - /
radium226
1
@ radium226 docker volume create --name anamecrée un volume nommé : Vous attribuez un chemin d'accès au conteneur à l'exécution docker run -v aname:/apath:: ce conteneur a maintenant un volume qui lui est attaché, monté dans son dossier / apath. J'ai réécrit la réponse pour que cela soit clair.
VonC le
11

VOLUMEl'instruction devient intéressante lorsque vous la combinez avec le volumes-fromparamètre d'exécution.

Compte tenu du Dockerfile suivant:

FROM busybox
VOLUME /myvolume

Construisez une image avec:

docker build -t my-bb .

Et faites tourner un conteneur avec:

docker run --rm -it --name my-first-bb my-bb

La première chose à noter est que vous aurez un dossier dans cette image nommé myvolume. Mais ce n'est pas particulièrement intéressant car lorsque nous sortirons du conteneur, le volume sera également supprimé.

Créez un fichier vide dans ce dossier, alors exécutez ce qui suit dans le conteneur:

cd myvolume
touch hello.txt

Maintenant, lancez un nouveau conteneur, mais partagez le même volume avec my-first-bb:

docker run --rm -it --volumes-from my-first-bb --name my-second-bb my-bb

Vous verrez que my-second-bbcontient le fichier hello.txtdans le myvolumedossier.

Une fois que vous quittez les deux conteneurs, votre volume sera également supprimé.

Koray Tugay
la source
Les volumes seront supprimés car ce sont des volumes anonymes ET vous avez démarré les conteneurs avec l' --rmoption. Je pense que cela pourrait fonctionner de le mentionner. Si vous n'avez pas démarré un conteneur avec --rm, vous pouvez toujours supprimer le conteneur et ses volumes anonymes avec docker rm -v my-container.
AymDev