How do you perform a dump of a Neo4j database within a Docker container?

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?

8
задан 27 February 2017 в 23:08
4 ответа

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
7
ответ дан 2 December 2019 в 23:03

У меня раньше была такая же проблема, поэтому я написал этот обходной путь, чтобы выгрузить данные 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, затем скопируйте дамп на хост, просто обновите и на свой

0
ответ дан 2 December 2019 в 23:03

По совпадению, теперь это намного проще сделать в 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 /

0
ответ дан 7 February 2020 в 13:19

Я сделал так:

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 применима к процедуре загрузки.

2
ответ дан 23 July 2020 в 22:14

Теги

Похожие вопросы