A docker container for Neo4j is started as per the documentation and working properly using the following command:
$ 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
When I attempt to perform a neo4j-admin
dump of the database I get an error:
$ 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
However, if the Neo4j process is stopped, which seems to be the only way to free the database, the container closes. This appears to be the expected behavior from Docker. Therefore, it appears to be impossible to call neo4j-admin dump
from within the container without the database being in use.
How can this be resolved while still using Docker?
1: Остановка контейнера.
docker stop myname-neo4j
2: Удаление контейнера
docker rm myname-neo4j
3: Запуск контейнера в интерактивном режиме (-it) без опции (detach) и выполнение оболочки ( /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). Вы должны увидеть сообщение "Unable to connect".
5: Dump your database
docker exec -ti myname-neo4j bin/neo4j-admin dump --database=graph.db --to=/home/name/myname.dump
У меня раньше была такая же проблема, поэтому я написал этот обходной путь, чтобы выгрузить данные 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 /
Я сделал так:
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]
Тогда вы можете либо сохранить контейнер "dump" и использовать его повторно, либо просто удалить его. Та же концепция с точкой входа и параметром -c применима к процедуре загрузки.