Meu arquivo de composição do docker possui três contêineres, web, nginx e postgres. O Postgres fica assim:
postgres:
container_name: postgres
restart: always
image: postgres:latest
volumes:
- ./database:/var/lib/postgresql
ports:
- "5432:5432
Meu objetivo é montar um volume que corresponda a uma pasta local chamada ./database
dentro do contêiner do postgres como /var/lib/postgres
. Quando inicio esses contêineres e insiro dados no postgres, verifico se /var/lib/postgres/data/base/
estão cheios dos dados que estou adicionando (no contêiner do postgres), mas no meu sistema local, ./database
apenas obtém uma data
pasta nele, ou seja, ./database/data
é criada, mas está vazia . Por quê?
Notas:
- Isso sugere que meu arquivo acima deve funcionar.
- Essa pessoa está usando serviços de docker, o que é interessante
ATUALIZAÇÃO 1
Por sugestão de Nick, fiz um docker inspect
e descobri:
"Mounts": [
{
"Source": "/Users/alex/Documents/MyApp/database",
"Destination": "/var/lib/postgresql",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
},
{
"Name": "e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35",
"Source": "/var/lib/docker/volumes/e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35/_data",
"Destination": "/var/lib/postgresql/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
O que faz parecer que os dados estão sendo roubados por outro volume que não me codifiquei. Não sei por que isso é. A imagem do postgres está criando esse volume para mim? Nesse caso, existe alguma maneira de usar esse volume em vez do volume que estou montando quando reinicio? Caso contrário, existe uma boa maneira de desativar esse outro volume e usar o meu ./database
?
ATUALIZAÇÃO 2
Encontrei a solução, graças ao Nick! (e outro amigo) Responda abaixo.
fonte
initdb
linha de comando para inicializar seu cluster de banco de dados?from app import db
edb.create_all()
a partir de umdocker run
após o início dos recipientes. Eu nãoinitdb
diretamente da linha de comando.sudo su -
e procurar./database/data
. Não há nada lá, tanto quanto eu posso dizer.Respostas:
Curiosamente, a solução acabou sendo mudar
para
fonte
/var/lib/postgresql/data
- você pode ler as notas variáveis PGDATA aqui: store.docker.com/images/....dockerignore
arquivo, especialmente se você fizer isso com uma imagem de produção. Consulte codefresh.io/blog/not-ignore-dockerignore para uma discussão.docker rm my_postgres_container_1
antes que funcionasse (também High Sierra).Você pode criar um volume comum para todos os dados do Postgres
ou você pode configurá-lo para o arquivo de composição
Ele criará o nome do volume pgdata e montará esse volume no caminho do contêiner.
Você pode inspecionar este volume
fonte
docker-compose down -v
. E qual é a solução para isso?docker-compose down --rmi all
sem a-v
opção e limpará "tudo", exceto os volumes, como contêineres, redes, imagens, etc. Eu faço isso ao implantar, permitindo a persistência dos dados.Eu evitaria usar um caminho relativo. Lembre-se de que o docker é um relacionamento daemon / cliente.
Quando você está executando a composição, é basicamente apenas dividir em vários comandos do cliente docker, que são passados ao daemon. Isso
./database
é relativo ao daemon , não ao cliente.Agora, a equipe de desenvolvedores do docker tem algumas informações sobre esse assunto , mas o resultado é que pode haver resultados inesperados.
Em resumo, não use um caminho relativo, use um caminho absoluto.
fonte
database/data
pasta ainda está vazia = (docker inspect
o contêiner e verifique se ele está ciente do volume (caso a composição esteja confusa ou algo assim). (nota: a janela de encaixe inspecionar pode ter dados confidenciais; portanto, não cole-os aqui sem usar a munging ;-) Depois disso, é uma questão de verificar as permissões (embora isso normalmente mostre um erro)Eu acho que você só precisa criar seu volume fora do docker primeiro com um
docker create -v /location --name
e depois reutilizá-lo.E quando eu costumava usar muito o docker, não era possível usar um volume estático do docker com a definição do dockerfile, então minha sugestão é tentar a linha de comando (eventualmente com um script).
fonte