在Docker容器中加载Neo4j转储时出现问题

时间:2018-10-11 11:22:44

标签: docker neo4j docker-container

我正在使用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转储加载到新建的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转储,而无需以交互方式启动单独的容器然后触发neo4j-admin load命令。

是否可以在不运行Docker容器的情况下启动Docker容器?如果可以的话,那么我可以进入容器中,并根据需要多次触发neo4j-admin load命令。

从很长一段时间以来,我一直在解决这个问题。非常感谢您在此问题上的帮助。

2 个答案:

答案 0 :(得分:0)

我现在想到的一种简单快捷的方法是覆盖默认的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]检查数据库转储是否存在以及是否运行neo4j dump import命令。在此neo4j启动之后。

考虑到$ HOME / datanew目录中有一个名为db.dump的数据库转储,neo4j-admin应该能够在启动neo4j服务器之前加载它。停止它,用一个新的转储替换转储,然后再次备份它,将启动新的数据库。

如果您基于neo4j映像创建docker映像并在末尾添加命令,那么可以肯定可以完成相同的操作。那应该更干净。

答案 1 :(得分:0)

似乎您使用的是Neo4j Community Edition,而不是Enterprise Edition,因此您无法在运行时加载数据库转储。此功能仅在企业版中提供,因此在社区版中,您可能需要对其进行调整。

因此,在启动neo4j容器之前,将转储复制到要安装在容器上的路径中,并在docker run上加载

# 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