PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Il volume Docker non mantiene i dati

C'è qualcosa che mi ha confuso e per me non era molto chiaro nella documentazione ufficiale.

Per quanto ne so, i volumi persistenti possono essere creati in tre modi.

  • Al contenitore ora di chiamata incluso il percorso completo ( -v ~/database:/data ):rende disponibile una cartella esterna dall'host all'interno del contenitore della finestra mobile. Entrambi possono modificarlo.
  • Al tempo di chiamata del contenitore utilizzando un nome di volume ( -v datamysql:/data ):rende disponibile un volume persistente all'interno del contenitore. Si crea se non esistesse. Puoi elencarli per nome con docker volume ls . Internamente, verrà archiviato in una posizione come /var/lib/docker/volumes/ae4445f7c9317a22fe84726fb894c47754f38a7fd150c00fd877024889968750/_data .
  • Al container tempo di costruzione ( VOLUME ["/database/data"] in Dockerfile). Ogni chiamata di docker run creerà un nuovo volume che persisterà anche se elimini il contenitore. Questo può creare confusione perché le chiamate successive risulteranno diverse volumi in fase di creazione che non verranno riutilizzati.

Puoi elencare sia i volumi con nome (secondo caso) che senza nome (terzo caso) con

$ docker volume ls                                                             
DRIVER              VOLUME NAME                                                             
local               064593b3e65977097d4d0c8402a6c633f1af69be2937bf118678ab8f97ee9a7e               
local               4753ad0437d13e54c76d9c34a30a1843396a1866a0cf9237d500fdcca0d78c5f           
local               8d7a35354f666b2e8a26866a35bbae36bb9601701d4c6b505ab8ce6629f69415               
local               db48eefe8f189b36107ca9c4eebb792690590ab0ba055e7e4e2c9adfd1765b7e                    
local               datamysql

Puoi vedere la posizione esatta del volume di un container usando docker inspect mycontainer

{
                "Type": "volume",
                "Name": "8d7a35354f666b2e8a26866a35bbae36bb9601701d4c6b505ab8ce6629f69415",
                "Source": "/media/USBdrive/docker/volumes/8d7a35354f666b2e8a26866a35bbae36bb9601701d4c6b505ab8ce6629f69415/_data",
                "Destination": "/var/lib/mysql",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },

Potrebbe essere utile rimuovere i volumi inutilizzati (specialmente per il terzo caso).

$ docker volume prune
WARNING! This will remove all volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
4753ad0437d13e54c76d9c34a30a1843396a1866a0cf9237d500fdcca0d78c5f

Total reclaimed space: 205MB

Perché hai usato il VOLUME direttiva nel tuo Dockerfile, sei nel terzo caso. Ispeziona il tuo contenitore per cercare il file e specifica il volume dalla riga di comando se desideri che le sessioni ripetute permettano di mantenere i dati.