Назад | Перейти на главную страницу

Как вы выполняете дамп базы данных Neo4j в контейнере 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.dump
command 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 и вытащить их за пределы контейнера на хост-машину.

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

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

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

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

STOP DATABASE foo

docker exec -it our-neo4j-container neo4j-admin dump --database=foo --to=/tmp/foo.db.dump

docker cp our-neo4j-container:/tmp/foo.db.dump .

START DATABASE foo

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