在Docker容器中加载neo4j转储文件出现问题

3
我正在使用Docker为我的项目启动多个Neo4j实例。 我有一个要求,必须将图形转储加载到其中一个Neo4j Docker容器中,并且我必须一遍又一遍地这样做(因为图形转储将由另一组人提供)。
以下是我执行相同操作的步骤 -
    # docker run --publish=7474:7474 --publish=7687:7687 \
    --volume=/home/dimension/neo4j/container3/data:/data \
    --volume=/home/dimension/neo4j/container3/logs:/logs \
    --volume=/home/dimension/neo4j/container3/conf:/conf \
    --volume=/home/dimension/neo4j/container3/plugins:/plugins \
    neo4j:3.3.3

    # docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                                                      NAMES
eee581b2f493        neo4j:3.3.3         "/docker-entrypoint.…"   2 hours ago         Up 2 seconds               0.0.0.0:7474->7474/tcp, 7473/tcp, 0.0.0.0:7687->7687/tcp   priceless_ride

这个命令可以启动容器,但是数据库是空的。接下来我尝试了以下方法,将一个neo4j dump加载到新构建的docker容器中。

# docker stop priceless_ride
priceless_ride

# cp home/dimension/neo4j/dumps/2018-09-05.dump ~/neo4j/container3/data/

# docker run --publish=7474:7474 --publish=7687:7687 \
--volume=/home/dimension/neo4j/container3/data:/data \
--volume=/home/dimension/neo4j/container3/logs:/logs \
--volume=/home/dimension/neo4j/container3/conf:/conf \
--volume=/home/dimension/neo4j/container3/plugins:/plugins \
-i -t neo4j:3.3.3 /bin/bash

以上命令创建一个独立的容器并以交互模式运行容器。一旦我进入容器,我运行 -

bash-4.4# bin/neo4j-admin load --from=/data/2018-09-05.dump --database=graph.db --force
bash-4.4# exit

现在我执行docker ps -a命令,输出中会看到2个容器。
docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
073c31c75ff5        neo4j:3.3.3         "/docker-entrypoint.…"   8 seconds ago       Exited (0) 3 seconds ago                       focused_zhukovsky
eee581b2f493        neo4j:3.3.3         "/docker-entrypoint.…"   3 hours ago         Exited (0) 7 minutes ago                       priceless_ride

我需要删除新建的容器,因为它不再需要了。执行命令docker rm focused_zhukovsky

当我执行命令重新启动容器时,一切都正常。

# docker start priceless_ride

使用 http://127.0.0.1:7474/browser/ 检查浏览器,容器现在已经加载了来自转储的数据库表单。

按照上述步骤加载图形转储是可以的,但如果我必须再次执行它,那么这是很繁琐的。有没有更干净的方法加载neo4j dump而不需要启动单独的交互式模式容器,然后发出neo4j-admin load命令。

是否可能在不运行其中的neo4j的情况下启动docker容器。如果这是可能的,那么我可以进入容器并随意多次执行neo4j-admin load命令。

我已经被这个问题困扰了一段时间。非常感谢对此问题的任何帮助。

2个回答

2

我现在能想到的一种简单快捷的方法是覆盖默认的neo4j容器命令,类似于这样:

docker run  -d --publish=7474:7474 --publish=7687:7687 --volume=$HOME/neo4j/datanew:/data neo4j /bin/bash -c "[ -f /data/db.dump ] && /var/lib/neo4j/bin/neo4j-admin load --from=/data/db.dump --database=graph.db --force; neo4j console"

您可以使用-c命令和/bin/bash来执行多个命令。[ -f /data/db.dump ]检查db dump是否存在,如果存在,则运行neo4j dump import命令。之后启动neo4j。
假设您的$HOME/datanew目录中有一个名为db.dump的数据库转储文件,那么在启动neo4j服务器之前,neo4j-admin应该能够加载它。停止它,用新的替换转储文件,然后重新启动它,即可启动新的数据库。
如果您基于neo4j镜像创建docker映像并在最后添加相同的命令,那么也可以完成相同的操作,这样会更加简洁。

他说:“我尝试过了,但无法使其正常工作。容器已经启动,但除了/data/目录之外,没有任何目录被映射到相应的容器目录中。而且我也无法访问 - http://127.0.0.1:7474/browser/。另外,-c "[ -f /data/db.dump ]" 命令是什么意思?你能否详细解释一下这个命令?” - Anurag Sharma
@AnuragSharma更新了答案并提供了额外的信息。 因此,我提供的命令中,主机上的neo4j目录将位于$HOME/neo4j/datanew。如果您将名为“db.dump”的数据库转储文件放在那里,然后运行容器,它应该会捡起这个转储。 此外,停止容器,更新转储并再次启动它将再次导入它。 - Himanshu Jain
感谢您的解释,转储已成功加载,我能够看到 databases/ 和 dbms/ 目录,但我无法从浏览器访问 http://127.0.0.1:7474/browser/。 - Anurag Sharma
@AnuragSharma 你的意思是在按照这些步骤之前可以访问浏览器,但现在不能访问了吗? 你可以通过登录容器并检查neo4j是否实际运行来进行验证。 - Himanshu Jain

2

看起来您正在使用的是Neo4j社区版而不是企业版,因此您无法在运行时加载数据库转储。这个功能只在企业版中独有,所以在社区版中您可能需要进行调整。

因此,在启动neo4j容器之前,请将您的转储复制到您要挂载到容器上的路径中,并在docker运行时加载它。

# cp home/dimension/neo4j/dumps/2018-09-05.dump ~/neo4j/container3/data/

# docker run --publish=7474:7474 --publish=7687:7687 \
    --volume=/home/dimension/neo4j/container3/data:/data \
    --volume=/home/dimension/neo4j/container3/logs:/logs \
    --volume=/home/dimension/neo4j/container3/conf:/conf \
    --volume=/home/dimension/neo4j/container3/plugins:/plugins \
    -it neo4j:3.3.3 /bin/bash -c "[ -f /data/db.dump ] \
    && /var/lib/neo4j/bin/neo4j-admin load --from=/data/db.dump \
    --database=graph.db --force

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接