PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

O volume do Docker não mantém os dados


Há algo que me confundiu e para mim não ficou muito claro na documentação oficial.

Que eu saiba, volumes persistentes podem ser criados em três caminhos.
  • No contêiner tempo de invocação incluindo o caminho completo ( -v ~/database:/data ):disponibiliza uma pasta externa do host dentro do contêiner docker. Ambos podem modificá-lo.
  • No contêiner tempo de invocação usando um nome de volume ( -v datamysql:/data ):disponibiliza um volume persistente dentro do contêiner. É criado se não existisse. Você pode listá-los por nome com docker volume ls . Internamente, ele será armazenado em um local como /var/lib/docker/volumes/ae4445f7c9317a22fe84726fb894c47754f38a7fd150c00fd877024889968750/_data .
  • No contêiner tempo de compilação ( VOLUME ["/database/data"] em Dockerfile). Cada invocação de docker run criará um novo volume que persistirá mesmo se você excluir o contêiner. Isso pode ser confuso porque invocações subsequentes resultarão em diferentes volumes sendo criados que não serão reutilizados.

Você pode listar volumes nomeados (segundo caso) e não nomeados (terceiro caso) com
$ docker volume ls                                                             
DRIVER              VOLUME NAME                                                             
local               064593b3e65977097d4d0c8402a6c633f1af69be2937bf118678ab8f97ee9a7e               
local               4753ad0437d13e54c76d9c34a30a1843396a1866a0cf9237d500fdcca0d78c5f           
local               8d7a35354f666b2e8a26866a35bbae36bb9601701d4c6b505ab8ce6629f69415               
local               db48eefe8f189b36107ca9c4eebb792690590ab0ba055e7e4e2c9adfd1765b7e                    
local               datamysql

Você pode ver a localização exata do volume de um contêiner 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": ""
            },

Pode ser útil remover volumes não utilizados (para o terceiro caso, especialmente).
$ 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

Porque você usou o VOLUME diretiva em seu Dockerfile, você está no terceiro caso. Inspecione seu contêiner para procurar o arquivo e especifique o volume na linha de comando se desejar que sessões repetidas persistam dados.