Perché la docker-machine cancella i dati al riavvio?


9

Sto usando Docker Toolbox su OSX.

Ho creato un contenitore di volumi di dati per l'archiviazione di dati persistenti: https://docs.docker.com/userguide/dockervolumes/#creating-and-mounting-a-data-volume-container .

Ho verificato che questi dati siano effettivamente archiviati nella VM boot2docker (creata dalla docker-machine) e non nel contenitore, in modo che persista. Tuttavia, il "riavvio della finestra mobile" cancella questi dati personalizzati su VM.

Non riesco a trovare la documentazione su ciò che sta accadendo. Ho trovato un post sul forum in cui si menzionava che i dati in / var / lib / docker verranno conservati, ma non sono riuscito a trovare alcun documento ufficiale che lo affermi e sembra anche strano considerando che la guida di archiviazione persistente sopra non utilizza questo percorso o addirittura menziona che i tuoi dati saranno cancellati.

È previsto e, in caso affermativo, esiste una documentazione ufficiale sul percorso corretto per l'archiviazione dei dati persistenti?


Modifica: aggiunta di esempio di senario in errore

$ docker-machine ssh alt
docker@alt:~$ docker run -v /data:/var/lib/mysql --name mydata busybox sh -c "echo 'hello' > /var/lib/mysql/hello"
docker@alt:~$ docker run --rm --volumes-from mydata busybox sh -c "cat /var/lib/mysql/hello"
hello
docker@alt:~$ exit
$ docker-machine restart alt
Starting VM...
$ docker-machine ssh alt
docker@alt:~$ docker run --rm --volumes-from mydata busybox sh -c "cat /var/lib/mysql/hello"
cat: can't open '/var/lib/mysql/hello': No such file or directory

Risposte:


8

Questo sicuramente dovrebbe funzionare:

$ docker-machine ssh default
docker@default:~$ docker run -v /data --name mydata busybox true
docker@default:~$ docker run --volumes-from mydata busybox sh -c "echo hello >/data/hello"
docker@default:~$ docker run --volumes-from mydata busybox cat /data/hello
hello
docker@default:~$ exit
$ docker-machine restart default
Starting VM...
$ docker-machine ssh default
docker@default:~$ docker run --volumes-from mydata busybox cat /data/hello
hello

Puoi approfondire i passaggi per riprodurre il tuo problema?

boot2docker ha un filesystem di sola lettura (verrà cancellato al riavvio) ad eccezione di:

  1. Contenitori e loro dati (volumi): questo è ciò che leggi /var/lib/docker
  2. Immagini docker
  3. Configurazione Docker (ad es. /var/lib/boot2docker/profileDove è possibile modificare i flag dei demoni)

Ciao, ho appena suggerito una modifica alla tua risposta. Intendevi specificare l'immagine di busybox nei comandi 2a 3a e 4a corsa? Senza farlo, la finestra mobile tenta di scaricare immagini chiamate "sh" e "cat" che sospetto non siano quelle che intendevi. Aggiungerò un esempio fallito sopra.
Gerry,

Grazie per l'aiuto. Sia tu che @ mc0e avete aiutato con questo, quindi vi ho dato il segno di spunta e lui la generosità (oltre a un +1 per entrambi). Spero che lo consideri giusto.
Gerry,

1
Ah sì, mal digitato. Ci scusiamo per l'errore di battitura.
nathanleclaire,

Non sono necessarie scuse. Stavo solo ricontrollando per essere sicuro di non aver frainteso. Saluti per tutto il vostro aiuto in questo.
Gerry,

6

Non uso boot2docker, ma se / data viene cancellato al riavvio, è lì che viene archiviato il volume ( docker run -v /data:/var/lib/mysql), quindi andrà perso.

Quello che stai facendo è anche combinare due diversi modelli per gestire la persistenza del volume. Per ottenere la persistenza, i contenitori possono montare volumi da una posizione specificata sul sistema host (che si presume sia persistente) oppure possono essere associati a un contenitore di dati e montati --volumes-from. Sembra che l'approccio del filesystem host non sia appropriato per boot2docker e si dovrebbe usare il modello del volume di dati (solo).

Presumibilmente dovresti creare il tuo contenitore di dati con -v /var/lib/mysql, piuttosto che -v /data:/var/lib/mysql.


Creare un volume usando il flag -v e quindi usare i volumi di quel contenitore in altri contenitori usando --volumes-from è esattamente ciò che mostra la documentazione: docs.docker.com/userguide/dockervolumes/… Mi aspetterei che se -v / location sa che dovrebbe essere relativo a / var / lib / docker / volumi quindi l'aggiunta di due punti non dovrebbe cambiarlo. Per lo meno questo non è intuitivo. -v / var / lib / mysql! = -v / var / lib / mysql: / var / lib / mysql Sembra anche che i documenti mysql-docker debbano essere aggiornati: hub.docker.com/_/mysql/#caveats
Gerry,

Grazie per l'aiuto. Sia tu che @nathanleclaire avete aiutato con questo, quindi vi ho dato la grazia (perché vale di più) e ho dato il segno di spunta a Nathanleclaire (così come un +1 per entrambi). Spero che tu pensi che sia giusto.
Gerry,

@Gerry Si consiglia di creare un volume e quindi di usarlo tramite --volumes-from. Il montaggio dei dati / effimeri sul contenitore non lo è.
mc0e

Sì, il problema è che non lo sapevo / i dati erano effimeri fino al riavvio.
Gerry,

0

Si noti che sto usando docker per mac beta che utilizza xhyve vm.

Il contenuto di / var / lib / boot2docker verrà mantenuto tra i riavvii della macchina. Quindi, se vuoi che determinati file siano disponibili sul tuo vm, inseriscili in questa directory.

Se si desidera che siano accessibili in una posizione diversa per l'esecuzione di contenitori docker, è possibile aggiungere quanto segue a / var / lib / boot2docker / profile:

mkdir -p /desired/path
ln -s /var/lib/boot2docker/your.file /desire/path/your.file

Se vuoi aggiungere un'altra configurazione ai file di sistema che persisterà tra i riavvii di VM come valori extra nel tuo file hosts, puoi aggiungere un comando come quello qui sotto a / var / lib / boot2docker / profile:

echo '127.0.0.1 your.domain.com' >> /etc/hosts

Spero che sia d'aiuto

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.