Como você executa um despejo de um banco de dados Neo4j dentro de um contêiner Docker?

Um contêiner docker para Neo4j é iniciado como de acordo com a documentação e funcionando corretamente usando o seguinte comando:

$ docker run \    --detach \    --publish=7474:7474 \    --publish=7473:7473 \    --publish=7687:7687 \    --volume=$HOME/neo4j/data:/data \    --volume=$HOME/neo4j/logs:/logs \    --volume=$HOME/neo4j/ssl:/ssl \    --ulimit=nofile=40000:40000 \    --name=myname-neo4j \    neo4j:3.1.1

Quando tento realizar um neo4j-admin despejo do banco de dados Eu recebo um erro:

$ docker exec -ti myname-neo4j bin/neo4j-admin dump --database=graph.db --to=/home/name/myname.dumpcommand failed: the database is in use -- stop Neo4j and try again

No entanto, se o processo Neo4j for interrompido, o que parece ser a única maneira de liberar o banco de dados, o contêiner será fechado. Este parece ser o comportamento esperado do Docker. Portanto, parece ser impossível chamar neo4j-admin dump de dentro do contêiner sem que o banco de dados esteja em uso.

Como isso pode ser resolvido enquanto ainda usa o Docker?

1: Pare o recipiente.

docker stop myname-neo4j

2: Remova o recipiente

docker rm myname-neo4j

3: Execute o contêiner como modo interativo (- it) sem a opção (desanexar) e executando o shell ( /bin/bash).

docker run \--publish=7474:7474 \--publish=7473:7473 \--publish=7687:7687 \--volume=$HOME/neo4j/data:/data \--volume=$HOME/neo4j/logs:/logs \--volume=$HOME/neo4j/ssl:/ssl \--ulimit=nofile=40000:40000 \--name=myname-neo4j \-it \neo4j:3.1.1 \-c /bin/bash

Agora você está dentro do contêiner neo4j sem executar o Neo.

4: Verifique se o neo não está ativo visitando o endpoint URI em (http://yourhost:7474). Você deve ver a mensagem" não é possível conectar".

5: despejar seu banco de dados

docker exec -ti myname-neo4j bin/neo4j-admin dump --database=graph.db --to=/home/name/myname.dump

Eu fiz isso:

docker stop [neo4j container]    docker run --name dump --entrypoint="/bin/bash" -it -v $HOME/neo4j/data:/data neo4j:3.1.1 -c "neo4j-admin dump --to=/data/db.dump"    docker start [neo4j container]

Então você pode manter o" dump & quot; recipiente e reutilizá - lo, ou apenas removê-lo. O mesmo conceito com o parâmetro entrypoint e-C se aplicaria ao procedimento de carga.

Por coincidência, agora é muito mais fácil fazer isso no Neo4j 4.0 porque você pode parar e iniciar bancos de dados sem ter que desligar todo o contêiner do Docker.

Então, se quiséssemos fazer um despejo de um banco de dados chamado 'foo', faríamos o seguinte:

STOP DATABASE foodocker exec -it our-neo4j-container neo4j-admin dump --database=foo --to=/tmp/foo.db.dumpdocker cp our-neo4j-container:/tmp/foo.db.dump .START DATABASE foo

Também escrito como um post de blog - https://markhneedham.com/blog/2020/01/28/neo4j-database-dump-docker-container/

Eu tive o mesmo problema antes, então escrevi esta solução alternativa para despejar dados neo4j e puxá-los para fora do contêiner para a máquina host.

docker rm --force neo4j-dumpdocker run \--name neo4j-dump \--env-file /storage/bin/.neo4j.env \--mount type=bind,source=<neo4j_data_folder>,target=/data \neo4j:3.1.1 bin/neo4j-admin dump --database=graph.db --to=/graph.db.dumpdocker cp `docker ps -aqf "name=neo4j-dump"`:/graph.db.dump <target_dump_file>docker rm --force neo4j-dump

Isso criará um novo contêiner e despejará dados em vez de iniciar o serviço neo4j e, em seguida, copiará o despejo para o host, basta atualizar e para o seu