Контейнер 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, затем скопируйте дамп на хост, просто обновите и на ваш