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

5

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

$ 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 executar um neo4j-admin dump do banco de dados obter um erro:

$ docker exec -ti myname-neo4j bin/neo4j-admin dump --database=graph.db --to=/home/name/myname.dump
command 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 é fechado. Este parece ser o comportamento esperado do Docker. Portanto, parece impossível chamar neo4j-admin dump de dentro do contêiner sem o banco de dados estar em uso.

Como isso pode ser resolvido enquanto ainda estiver usando o Docker?

    
por Gregyski 27.02.2017 / 07:57

2 respostas

5

1: Pare o contêiner.

docker stop myname-neo4j

2: Remova o recipiente

docker rm myname-neo4j

3: Executar o container como modo interativo (-it) sem a opção (desanexar) e executar 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 no ( link ). Você deve ver a mensagem "Não foi possível conectar".

5: Jogue seu banco de dados

docker exec -ti myname-neo4j bin/neo4j-admin dump --database=graph.db --to=/home/name/myname.dump
    
por 09.03.2017 / 23:47
0

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

docker rm --force neo4j-dump

docker 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.dump

docker 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, depois copiará o dump para o host, apenas atualize e para o seu

    
por 03.08.2018 / 15:11

Tags