如何在 Docker 容器内转储 Neo4j 数据库?

如何在 Docker 容器内转储 Neo4j 数据库?

Neo4j 的 docker 容器启动如下:根据文档并使用以下命令正常工作:

$ 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-admin dump但是,如果 Neo4j 进程停止(这似乎是释放数据库的唯一方法),容器就会关闭。这似乎是 Docker 的预期行为。因此,在没有使用数据库的情况下, 似乎不可能从容器内部进行调用。

在仍然使用 Docker 的情况下如何解决这个问题?

答案1

1:停止容器。

docker stop myname-neo4j

2:取出容器

docker rm myname-neo4j

3:以交互模式(-it)运行容器,不使用选项(detach)并执行 shell(/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:通过访问 URI 端点来检查 neo 是否已启动(http://你的主机名:7474)。您应该会看到“无法连接”消息。

5:转储数据库

docker exec -ti myname-neo4j bin/neo4j-admin dump --database=graph.db --to=/home/name/myname.dump

答案2

我这样做了:

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 参数相同的概念也适用于加载过程。

答案3

巧合的是,现在在 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/

答案4

我之前遇到过同样的问题,因此我编写了这个解决方法来转储 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 服务,然后将转储复制到主机,只需更新并复制到您的主机即可

相关内容