Как вы выполняете дамп базы данных Neo4j в контейнере Docker?

Контейнер docker для Neo4j запускается как в соответствии с документацией и работает должным образом, используя следующую команду:

$ 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

Когда я пытаюсь выполнить neo4j-admin дамп базы данных Я получаю сообщение об ошибке:

$ 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

Однако, если процесс Neo4j остановлен, что, по-видимому, является единственным способом освободить базу данных, контейнер закрывается. Похоже, это ожидаемое поведение от Docker. Поэтому, по-видимому, невозможно вызвать neo4j-admin dump из контейнера без использования базы данных.

Как это можно решить, продолжая использовать Docker?

1: Остановите контейнер.

docker stop myname-neo4j

2: Извлеките контейнер

docker rm myname-neo4j

3: Запустите контейнер в интерактивном режиме (-it) без опции (отсоединить) и запустите оболочку ( /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

Теперь вы находитесь внутри контейнера neo4j, не запуская Neo.

4: Убедитесь, что neo не запущен, посетив конечную точку URI в (http://yourhost:7474). Вы должны увидеть сообщение "Не удалось подключиться".

5: Сбросьте свою базу данных

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

Я сделал это:

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]

Затем вы можете либо сохранить контейнер "дамп" и повторно использовать его, либо просто удалить его. Та же концепция с точкой входа и параметром -c будет применяться и к процедуре загрузки.

По совпадению, теперь это намного проще сделать в Neo4j 4.0, потому что вы можете останавливать и запускать базы данных без необходимости закрывать весь контейнер Docker.

Итак, если бы мы хотели создать дамп базы данных с именем foo, мы бы сделали следующее:

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

Также написано в виде сообщения в блоге - https://markhneedham.com/blog/2020/01/28/neo4j-database-dump-docker-container/

У меня была такая же проблема раньше, поэтому я написал это обходное решение, чтобы сбросить данные neo4j и извлечь их из контейнера на хост-машину.

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

Это создаст новый контейнер и сбросит данные вместо запуска службы neo4j, затем скопируйте дамп на хост, просто обновите и на ваш