Qual è lo scopo di VOLUME in Dockerfile


106

Sto cercando di approfondire la mia comprensione del volume di Docker e ho difficoltà a capire le differenze / il caso d'uso di:

  • Il docker volume createcomando
  • Il docker run -v /path:/host_path
  • La VOLUMEvoce nel Dockerfilefile

In particolare non capisco cosa succede se combini la VOLUMEvoce con la -vbandiera.


Risposte:


70

Un volume è un dato persistente archiviato in /var/lib/docker/volumes/...

  • Puoi dichiararlo in un Dockerfile, il che significa che ogni volta che un contenitore viene avviato dall'immagine, il volume viene creato ( vuoto ), anche se non hai alcuna -vopzione.

  • Puoi dichiararlo in runtime docker run -v [host-dir:]container-dir.
    combinare i due ( VOLUME+ docker run -v) significa che puoi montare il contenuto di una cartella host nel tuo volume persistente dal contenitore in/var/lib/docker/volumes/...

  • docker volume create crea un volume senza dover definire un Dockerfile, creare un'immagine ed eseguire un contenitore. Viene utilizzato per consentire rapidamente ad altri contenitori di montare detto volume.

Se hai mantenuto alcuni contenuti in un volume, ma da allora hai eliminato il contenitore (che per impostazione predefinita non elimina il suo volume associato, a meno che tu non stia utilizzando docker rm -v), puoi ricollegare detto volume a un nuovo contenitore (dichiarando lo stesso volume).

Vedere " Docker - Come accedere a un volume non collegato a un contenitore? ".
Con la creazione del volume docker, è facile ricollegare un volume con nome a un contenitore.

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!

2
Diciamo che usi un Dockerfilecon VOLUMEe il -v /path:/host_path/flag. Il contenuto di VOLUMEverrà sovrascritto dal contenuto di /host_path/?
radium226

Grazie a te @VonC, penso di averlo capito :) E se fai un docker volume create --name my_volumeseguito da un docker run --volume-from my_volume, come fai a sapere dove sarà il mountpoint?
radium226

@ radium226 nessun punto di montaggio (ovvero niente montato dall'host, a parte il vuoto nativo / var / lib / docker / volume). Il percorso del volume è nei metadati my_volume: stackoverflow.com/a/31997267/6309
VonC

Capisco che non ci sia alcun punto di montaggio sul lato host. Ma all'interno del contenitore in esecuzione lanciato con docker run ..., come posso scrivere in un file archiviato nel my_volumevolume? Non conosco il ... percorso? del volume all'interno del mio contenitore in esecuzione perché non ho definito nulla? Spero di essere abbastanza chiaro, perché sicuramente non sono sicuro del mio vocabolario: - /
radium226

1
@ radium226 docker volume create --name anamecrea un volume denominato : Assegni un percorso del contenitore in runtime docker run -v aname:/apath:: quel contenitore ora ha un volume collegato ad esso, montato nella sua cartella / apath. Ho riscritto la risposta per renderlo più chiaro.
VonC

11

VOLUMEl'istruzione diventa interessante quando viene combinata con il volumes-fromparametro runtime.

Dato il seguente Dockerfile:

FROM busybox
VOLUME /myvolume

Crea un'immagine con:

docker build -t my-bb .

E fai girare un contenitore con:

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

La prima cosa da notare è che in questa immagine avrai una cartella denominata myvolume. Ma non è particolarmente interessante poiché quando usciamo dal contenitore verrà rimosso anche il volume.

Crea un file vuoto in questa cartella, quindi esegui quanto segue nel contenitore:

cd myvolume
touch hello.txt

Ora avvia un nuovo contenitore, ma condividi lo stesso volume con my-first-bb:

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

Vedrai che my-second-bbcontiene il file hello.txtnella myvolumecartella.

Una volta usciti da entrambi i contenitori, anche il volume verrà rimosso.


I volumi verranno eliminati perché sono volumi anonimi E hai avviato i contenitori con l' --rmopzione. Penso che potrebbe funzionare menzionarlo. Se non hai avviato un contenitore con --rm, puoi comunque rimuovere il contenitore e i suoi volumi anonimi con docker rm -v my-container.
AymDev
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.