2016-02-25 40 views
7

Mi rendo conto che altre persone hanno avuto domande simili ma questo utilizza il formato di file di composizione v2 e non ho trovato nulla per quello.Come rendere i volumi permanenti con Docker Compose v2

Voglio fare un'app di prova molto semplice per giocare con MemSQL ma non riesco a ottenere i volumi per non essere cancellato dopo docker-compose down. Se ho capito bene Docker Docs, i volumi non dovrebbero essere cancellati senza esplicitarlo. Tutto sembra funzionare con docker-compose up ma dopo essere andato giù e poi di nuovo tutti i dati vengono cancellati dal database.

Come consigliato, utilizzo un servizio separato di memsqldata come livello dati separato.

Ecco la mia finestra mobile-compose.yml:

version: '2' 
services: 
    app: 
     build: . 
     links: 
      - memsql 
    memsql: 
     image: memsql/quickstart 
     volumes_from: 
      - memsqldata 
     ports: 
      - "3306:3306" 
      - "9000:9000" 
    memsqldata: 
     image: memsql/quickstart 
     command: /bin/true 
     volumes: 
      - memsqldatavolume:/data 

volumes: 
    memsqldatavolume: 
     driver: local 
+1

Vorrei provare senza il contenitore memsqldata. Poiché stai utilizzando un volume con nome, non è necessario un contenitore del volume di dati. Ho provato 'down', e non rimuove alcun volume per impostazione predefinita. – dnephin

+0

È possibile che i dati mysql non siano nel volume? Non penso che usi '/ data' normalmente. – dnephin

risposta

4

Questo è stato fatto risalire a una cattiva documentazione da MemSQL. Il percorso dei dati MemSQL nel contenitore è /memsql e non nello /var/lib/memsql come in un'installazione autonoma (e nei documenti MemSQL), e sicuramente non nello /data come qualcuno mi ha detto.

1

Si utilizza docker-compose down e se si guarda la documentazione here

contenitori di arresto e rimuovere i contenitori, le reti, i volumi e le immagini creato da up. Solo i contenitori e le reti vengono rimossi per impostazione predefinita.

Avete ragione, non dovrebbe rimuovere i volumi (per impostazione predefinita). Potrebbe essere un bug o potresti aver cambiato la configurazione predefinita. Ma penso che il comando giusto per te sia docker-compose stop. Proverò a eseguire alcuni test con casi più semplici per il comando down.

+0

Sto usando tutto nella configurazione di default. Non sono un esperto di Docker quindi spero che vengano scelte le impostazioni predefinite;) Installato Toolbox ieri, quindi tutto dovrebbe essere aggiornato alle versioni più recenti: versione docker-compose 1.6.0, build d99cad6, versione docker-py: 1.7.0. – jimmy

+0

Hai già provato a creare ed eseguire il tuo 'memsqldata' da solo, fornire alcuni file nel tuo volume, quindi fermarlo/rimuovere il contenitore e vedere se ci sono ancora i file? –

+0

Sì. Ho provato la stessa struttura memsql per alcuni giorni. Ho appena provato che funziona anche se faccio stop docker-compose. È "giù" che sembra recitare non come si suppone. – jimmy

2

Non sicuro se questo aiuta o no. Quando si utilizza docker-compose up -d, il contenitore viene scaricato e le immagini sono state create. Per fermare le immagini del docker, le immagini rimarranno e potranno essere riavviate con docker-compose start

Stavo usando i comandi su/giù e continuavo a perdere i miei dati finché non ho provato lo stop/start e ora i dati persistono.

+0

Dopo un paio d'ore di ricerche questo ha risolto il mio problema! – mattsch

+0

Questo è sbagliato. 'docker-compose down' cancella i volumi. Penso che sia quello che intendeva dire Bobby. –

+2

Stop/Start manterrà gli stessi contenitori, se si perdono dati da un down/up, quindi non si memorizzano i dati in un volume, piuttosto i dati si trovano nel contenitore stesso che non dovrebbero essere considerati persistenti. 'docker-compose down' non elimina i volumi a meno che non si includa anche l'opzione' -v'. – BMitch

1

La soluzione più semplice è utilizzare docker-compose stop anziché docker-compose down. E poi docker-compose start per riavviare.

In base allo docs, down "interrompe i contenitori e rimuove contenitori, reti, volumi e immagini creati da up."

+1

'docker-compose down' non elimina i volumi a meno che non si passi l'opzione' -v'. – BMitch

+0

Questo non è quello che sto vedendo, con questo file [docker-compose.yml] (https://github.com/jstray/cjworkbench-docker/blob/master/docker-compose.yml). Giù elimina definitivamente il volume anche senza '-v'. Se c'è qualcosa che sto facendo male mi piacerebbe sapere! Vivo nella paura di perdere accidentalmente il mio database. –

+0

Probabilmente varrebbe la pena di fare una domanda separata con tutti i dettagli invece di provare a eseguire il debug nei commenti. – BMitch

8

Mi rendo conto che questo è un thread vecchio e risolto in cui l'OP stava puntando a una directory nel contenitore piuttosto che al volume che avevano montato, ma voleva chiarire parte della disinformazione che sto vedendo.

docker-compose down non rimuove i volumi, è necessario eseguire docker-compose down -v se si desidera eliminare anche i volumi.Ecco il testo della guida direttamente dalla finestra mobile-composizione (notare il "default" lista):

$ docker-compose down --help 
Stops containers and removes containers, networks, volumes, and images 
created by `up`. 

By default, the only things removed are: 

- Containers for services defined in the Compose file 
- Networks defined in the `networks` section of the Compose file 
- The default network, if one is used 

Networks and volumes defined as `external` are never removed. 

Usage: down [options] 

Options: 
... 
    -v, --volumes  Remove named volumes declared in the `volumes` section 
         of the Compose file and anonymous volumes 
         attached to containers. 
... 

$ docker-compose --version 
docker-compose version 1.12.0, build b31ff33 

Ecco un yml campione con un volume di nome per testare e un comando fittizio:

$ cat docker-compose.vol-named.yml 
version: '2' 

volumes: 
    data: 

services: 
    test: 
    image: busybox 
    command: tail -f /dev/null 
    volumes: 
    - data:/data 

$ docker-compose -f docker-compose.vol-named.yml up -d 
Creating volume "test_data" with default driver 
Creating test_test_1 

Dopo l'avvio il contenitore, il volume è inizializzato vuoto poiché l'immagine è vuota in quella posizione. Ho creato un mondo ciao veloce in quella posizione:

$ docker exec -it test_test_1 /bin/sh 
/# ls -al /data 
total 8 
drwxr-xr-x 2 root  root   4096 May 23 01:24 . 
drwxr-xr-x 1 root  root   4096 May 23 01:24 .. 
/# echo "hello volume" >/data/hello.txt 
/# ls -al /data 
total 12 
drwxr-xr-x 2 root  root   4096 May 23 01:24 . 
drwxr-xr-x 1 root  root   4096 May 23 01:24 .. 
-rw-r--r-- 1 root  root   13 May 23 01:24 hello.txt 
/# cat /data/hello.txt 
hello volume 
/# exit 

Il volume è visibile al di fuori finestra mobile ed è ancora lì dopo un docker-compose down:

$ docker volume ls | grep test_ 
local    test_data 

$ docker-compose -f docker-compose.vol-named.yml down 
Stopping test_test_1 ... done 
Removing test_test_1 ... done 
Removing network test_default 

$ docker volume ls | grep test_ 
local    test_data 

Ricreare il contenitore utilizza il vecchio volume con il file ancora all'interno visibile:

$ docker-compose -f docker-compose.vol-named.yml up -d 
Creating network "test_default" with the default driver 
Creating test_test_1 

$ docker exec -it test_test_1 /bin/sh 
/# cat /data/hello.txt 
hello volume 
/# exit 

e l'esecuzione di un docker-compose down -v finalmente rimuove sia il contenitore e il volume:

$ docker-compose -f docker-compose.vol-named.yml down -v 
Stopping test_test_1 ... done 
Removing test_test_1 ... done 
Removing network test_default 
Removing volume test_data 

$ docker volume ls | grep test_ 

$ 

Se trovate i dati è solo essere persisteva se si utilizza uno stop/start, piuttosto che un down/up, quindi i dati vengono archiviati nel contenitore, piuttosto che un volume, e il contenitore non è persistente . Assicurati che la posizione dei dati all'interno del contenitore sia corretta per evitare questo.

+0

Bel chiarimento.+1 – VonC

+0

Cosa significherebbe per i dati essere "nel contenitore" piuttosto che un volume? Presumo che qualsiasi cosa memorizzata in una directory mappata su un volume si trovi in ​​un volume? –

+0

Sì, ma come indicato dall'OP, se non si esegue il mapping del volume nella posizione corretta, i dati non si trovano in un volume ma piuttosto nel livello RW del contenitore. Quando si elimina il contenitore, tutte le modifiche apportate a quel contenitore (principalmente il livello del file system RW) che non sono state memorizzate in un volume vengono perse. – BMitch

Problemi correlati