¿Cómo se realiza un volcado de una base de datos Neo4j dentro de un contenedor Docker?

Un contenedor docker para Neo4j se inicia como según la documentación y funciona correctamente con el siguiente 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

Cuando intento realizar una neo4j-admin volcado de la base de datos Recibo un error:

$ 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

Sin embargo, si se detiene el proceso Neo4j, que parece ser la única forma de liberar la base de datos, el contenedor se cierra. Este parece ser el comportamiento esperado de Docker. Por lo tanto, parece imposible llamar neo4j-admin dump desde dentro del contenedor sin que la base de datos esté en uso.

¿Cómo se puede resolver esto mientras se sigue usando Docker?

1: Detenga el recipiente.

docker stop myname-neo4j

2: Retire el recipiente

docker rm myname-neo4j

3: Ejecute el contenedor en modo interactivo (- it) sin la opción (detach) y ejecutando el 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

Ahora está dentro del contenedor neo4j sin ejecutar Neo.

4: Verifique que neo no esté activo visitando el punto final de URI en (http://yourhost:7474). Debería ver el mensaje "No se puede conectar".

5: Volcar la base de datos

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

Hice esto:

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]

A continuación, puede conservar el contenedor de "volcado" y reutilizarlo, o simplemente eliminarlo. El mismo concepto con el punto de entrada y el parámetro-c se aplicaría para el procedimiento de carga.

Por coincidencia, ahora es mucho más fácil hacer esto en Neo4j 4.0 porque puede detener e iniciar bases de datos sin tener que apagar todo el contenedor de Docker.

Entonces, si quisiéramos tomar un volcado de una base de datos llamada 'foo', haríamos lo siguiente:

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

También escrito como una publicación de blog - https://markhneedham.com/blog/2020/01/28/neo4j-database-dump-docker-container/

Tuve el mismo problema antes, así que escribí esta solución para volcar los datos de neo4j y extraerlos del contenedor a la 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

Esto creará un nuevo contenedor y volcará los datos en lugar de iniciar el servicio neo4j, luego copiará el volcado en el host, solo actualice y en el suyo