Was ist der Zweck von VOLUME in Dockerfile?

106

Ich versuche, mein Verständnis von Dockers Volumen zu vertiefen, und es fällt mir schwer, die Unterschiede / den Anwendungsfall von:

  • Der docker volume createBefehl
  • Das docker run -v /path:/host_path
  • Der VOLUMEEintrag in der DockerfileDatei

Ich verstehe besonders nicht, was passiert, wenn Sie den VOLUMEEintrag mit der -vFlagge kombinieren .

Radium226
quelle

Antworten:

70

Ein Volume besteht aus persistenten Daten, die in gespeichert sind /var/lib/docker/volumes/...

  • Sie können es entweder in einer Docker-Datei deklarieren. Dies bedeutet, dass jedes Mal, wenn ein Container aus dem Image gestartet wird, das Volume erstellt wird ( leer ), auch wenn Sie keine -vOption haben.

  • Sie können es zur Laufzeit deklarieren docker run -v [host-dir:]container-dir.
    Durch die Kombination der beiden ( VOLUME+ docker run -v) können Sie den Inhalt eines Hostordners in Ihr Volume einbinden, das vom Container in beibehalten wird/var/lib/docker/volumes/...

  • Docker-Volume erstellen erstellt ein Volume, ohne eine Docker-Datei definieren und ein Image erstellen und einen Container ausführen zu müssen. Es wird verwendet, um anderen Behältern schnell zu ermöglichen, das Volumen zu montieren.

Wenn Sie einige Inhalte in einem Volume beibehalten haben, aber seitdem den Container gelöscht haben (der das zugehörige Volume standardmäßig nicht löscht, es sei denn, Sie verwenden Docker rm -v), können Sie das Volume erneut an einen neuen Container anhängen (deklarieren) das gleiche Volumen).

Siehe " Docker - Zugriff auf ein Volume, das nicht an einen Container angehängt ist? ".
Mit Docker-Volume erstellen können Sie ein benanntes Volume einfach wieder an einen Container anhängen.

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
quelle
2
Angenommen, Sie verwenden ein Dockerfilemit VOLUMEund die -v /path:/host_path/Flagge. Der Inhalt des VOLUMEwird durch den Inhalt von /host_path/?
Radium226
Dank dir @VonC, ich glaube ich verstehe :) Und wenn du ein docker volume create --name my_volumegefolgt von a docker run --volume-from my_volumemachst, woher weißt du, wo der Mountpoint sein wird?
Radium226
@ radium226 kein Einhängepunkt (was bedeutet, dass nichts vom Host bereitgestellt wird, außer dem nativen leeren / var / lib / docker / volume). Der Pfad des Volumes befindet sich in den Metadaten von my_volume
VonC
Ich verstehe, dass es auf der Hostseite keinen Mountpoint gibt. Aber docker run ...wie kann ich innerhalb des laufenden Containers in eine Datei schreiben, die auf dem my_volumeVolume gespeichert ist ? Ich kenne den ... Weg nicht? des Volumens in meinem laufenden Container, weil ich nichts definiert habe? Ich hoffe, ich bin klar genug, weil ich definitiv nicht sicher bin, was ich sagen kann: - /
radium226
1
@ radium226 the docker volume create --name anameerstellt ein benanntes Volume: Sie weisen zur Laufzeit einen Containerpfaddocker run -v aname:/apath zu :: An diesen Container ist jetzt ein Volume angehängt, das in seinem Ordner / apath bereitgestellt ist. Ich habe die Antwort umgeschrieben, um dies klar zu machen.
VonC
11

VOLUMEDie Anweisung wird interessant, wenn Sie sie mit dem volumes-fromLaufzeitparameter kombinieren .

Angesichts der folgenden Docker-Datei:

FROM busybox
VOLUME /myvolume

Erstellen Sie ein Bild mit:

docker build -t my-bb .

Und drehen Sie einen Behälter mit:

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

Das erste, was Sie bemerken müssen, ist, dass Sie in diesem Bild einen Ordner mit dem Namen haben myvolume. Dies ist jedoch nicht besonders interessant, da beim Verlassen des Containers auch das Volumen entfernt wird.

Erstellen Sie eine leere Datei in diesem Ordner. Führen Sie daher im Container Folgendes aus:

cd myvolume
touch hello.txt

Drehen Sie nun einen neuen Container hoch, teilen Sie jedoch das gleiche Volumen mit my-first-bb:

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

Sie werden sehen, dass my-second-bbdie Datei hello.txtim myvolumeOrdner enthält.

Sobald Sie beide Container verlassen, wird auch Ihr Volume entfernt.

Koray Tugay
quelle
Die Volumes werden gelöscht, da es sich um anonyme Volumes handelt UND Sie die Container mit der --rmOption gestartet haben . Ich denke, es könnte funktionieren, es zu erwähnen. Wenn Sie nicht gestartet werden , einen Behälter mit --rmentfernen, können Sie immer noch Container und seine anonymen Bände mit docker rm -v my-container.
AymDev