我正在使用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
命令。
从很长一段时间以来,我一直在解决这个问题。非常感谢您在此问题上的帮助。
答案 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