Докер-контейнер для 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/