2015-09-03 15 views
7

Ho un Dockerfile che indica al termine di un volume in questo modoCome riutilizzare lo stesso volume in Docker quando si riavvia un contenitore?

VOLUME /data 

Ora, quando ho costruire e gestire il contenitore ho davvero ottenere un nuovo volume creato e montato in /data.
Questo è molto buono, ma mi piacerebbe essere in grado di fermare questo contenitore e quindi eseguirlo di nuovo e assicurarsi che lo stesso volume con i suoi dati sia montato di nuovo.

Come posso ottenere quello?
Idealmente lo stesso comando creerebbe il volume se non esiste già e lo riutilizzerà se già esiste.

risposta

9

Se si desidera mantenere i dati oltre la durata del contenitore, è necessario creare il volume all'esterno del contenitore. Una possibilità è quella di creare un "contenitore volume di dati", come descritto in the documentation:

docker create -v /data --name my-data busybox /bin/true 

Questo crea un contenitore (di nome my-data). Si basa sull'immagine busybox, ma poiché stiamo usando create anziché run, in realtà non iniziamo nulla. Questo contenitore esiste solo per fornire un volume ad altri contenitori.

Possiamo quindi accedere a tale volume utilizzando l'opzione --volumes-from-docker run quando iniziamo un altro contenitore:

docker run --volumes-from my-data ... 

Ora avete un volume che esisteranno anche dopo esiste il contenitore, e persisterà fino a quando il Il contenitore my-data non viene eliminato.

In alternativa, si può semplicemente montare una directory host sul /data nel vostro contenitore, come in:

docker run -v /path/on/host:/data ... 

Questa opzione è anche descritto nella documentazione ho linkato sopra.

+0

Ho testato questa procedura (sul contenitore del volume di dati) e funziona come previsto. Ma quello che non capisco è che funziona anche * senza * fornendo un'istruzione VOLUME nel Dockerfile! Allora qual è lo scopo dell'istruzione VOLUME? –

+1

@BarryNL I volumi possono essere definiti in Dockerfile o usando 'docker run -v'. Se il volume è stato specificato in Dockerfile, il percorso locale è in genere simile a '/ var/lib/docker/vfs/...'. Puoi usare 'docker inspect -f {{.Volumes}} name' per scoprirlo. Tuttavia, ci sono differenze tra i volumi Dockerfile e 'run -v'-volumi. Se l'immagine di base del contenitore contiene dati nel punto di montaggio specificato, i dati esistenti vengono copiati nel nuovo volume al momento dell'inizializzazione del volume, ma solo se si tratta di un volume di Dockerfile. – fnkr

Problemi correlati