Docker下使用neo4j-admin导入数据后容器无法启动的问题求助
Docker中Neo4j社区版导入数据后容器无法启动的问题解决
问题场景
执行以下Docker命令运行Neo4j 5.11.0社区版并导入CSV数据:
docker run --publish=7474:7474 --publish=7687:7687 \ --volume=C:/mydir/import:/import \ --env NEO4J_AUTH=neo4j/password \ neo4j:5.11.0-community \ bin/neo4j-admin database import full --id-type=INTEGER --nodes=NodeA=/import/nodesa.csv --nodes=NodeB=/import/nodesb.csv --relationships=RELA=/import/rels.csv --multiline-fields=true
导入日志显示执行成功:
IMPORT DONE in 13s 945ms. Imported: 75650 nodes 95438 relationships 255509 properties Peak memory usage: 547.9MiB
但Docker Desktop中容器并未处于运行状态,尝试启动容器时触发报错:
java.lang.RuntimeException: java.nio.file.DirectoryNotEmptyException: /data/databases/neo4j already contains data, cannot do import here
重启容器后的完整日志:
2023-10-05 19:47:47 Neo4j version: 5.11.0 2023-10-05 19:47:47 Importing the contents of these files into /data/databases/neo4j: 2023-10-05 19:47:47 Nodes: 2023-10-05 19:47:47 [NodeA]: 2023-10-05 19:47:47 /import/nodea.csv 2023-10-05 19:47:47 2023-10-05 19:47:47 [NodeB]: 2023-10-05 19:47:47 /import/nodeb.csv 2023-10-05 19:47:47 2023-10-05 19:47:47 Relationships: 2023-10-05 19:47:47 RELA: 2023-10-05 19:47:47 /import/rels.csv 2023-10-05 19:47:47 2023-10-05 19:47:47 2023-10-05 19:47:47 Available resources: 2023-10-05 19:47:47 Total machine memory: 11.70GiB 2023-10-05 19:47:48 Free machine memory: 10.06GiB 2023-10-05 19:47:48 Max heap memory : 2.601GiB 2023-10-05 19:47:48 Max worker threads: 8 2023-10-05 19:47:48 Configured max memory: 6.760GiB 2023-10-05 19:47:48 High parallel IO: true 2023-10-05 19:47:48 2023-10-05 19:47:52 2023-10-05 19:47:52 IMPORT FAILED in 0ms. 2023-10-05 19:47:52 Data statistics is not available. 2023-10-05 19:47:52 Peak memory usage: 0B 2023-10-05 19:47:52 Database already exist. Re-run with `--overwrite-destination` to remove the database prior to import 2023-10-05 19:47:52 Caused by:/data/databases/neo4j already contains data, cannot do import here 2023-10-05 19:47:52 2023-10-05 19:47:52 WARNING Import failed. The store files in /data/databases/neo4j are left as they are, although they are likely in an unusable state. Starting a database on these store files will likely fail or observe inconsistent records so start at your own risk or delete the store manually 2023-10-05 19:47:52 java.lang.RuntimeException: java.nio.file.DirectoryNotEmptyException: /data/databases/neo4j already contains data, cannot do import here 2023-10-05 19:47:52 at org.neo4j.importer.CsvImporter.andPrintError(CsvImporter.java:358) 2023-10-05 19:47:52 at org.neo4j.importer.CsvImporter.doImport(CsvImporter.java:268) 2023-10-05 19:47:52 at org.neo4j.importer.CsvImporter.doImport(CsvImporter.java:181) 2023-10-05 19:47:52 at org.neo4j.importer.ImportCommand$Base.doExecute(ImportCommand.java:405) 2023-10-05 19:47:52 at org.neo4j.importer.ImportCommand$Full.execute(ImportCommand.java:531) 2023-10-05 19:47:52 at org.neo4j.cli.AbstractCommand.call(AbstractCommand.java:92) 2023-10-05 19:47:52 at org.neo4j.cli.AbstractCommand.call(AbstractCommand.java:37) 2023-10-05 19:47:52 at picocli.CommandLine.executeUserObject(CommandLine.java:2041) 2023-10-05 19:47:52 at picocli.CommandLine.access$1500(CommandLine.java:148) 2023-10-05 19:47:52 at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2461) 2023-10-05 19:47:52 at picocli.CommandLine$RunLast.handle(CommandLine.java:2453) 2023-10-05 19:47:52 at picocli.CommandLine$RunLast.handle(CommandLine.java:2415) 2023-10-05 19:47:52 at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2273) 2023-10-05 19:47:52 at picocli.CommandLine$RunLast.execute(CommandLine.java:2417) 2023-10-05 19:47:52 at picocli.CommandLine.execute(CommandLine.java:2170) 2023-10-05 19:47:52 at org.neo4j.cli.AdminTool.execute(AdminTool.java:94) 2023-10-05 19:47:52 at org.neo4j.cli.AdminTool.main(AdminTool.java:82) 2023-10-05 19:47:52 Caused by: java.nio.file.DirectoryNotEmptyException: /data/databases/neo4j already contains data, cannot do import here 2023-10-05 19:47:52 at org.neo4j.internal.batchimport.store.BatchingNeoStores.assertDatabaseIsNonExistent(BatchingNeoStores.java:230) 2023-10-05 19:47:52 at org.neo4j.internal.batchimport.store.BatchingNeoStores.createNew(BatchingNeoStores.java:203) 2023-10-05 19:47:52 at org.neo4j.internal.batchimport.ParallelBatchImporter.doImport(ParallelBatchImporter.java:131) 2023-10-05 19:47:52 at org.neo4j.importer.CsvImporter.doImport(CsvImporter.java:264) 2023-10-05 19:47:52 ... 15 more
问题原因
- 容器执行逻辑问题:
docker run命令后指定neo4j-admin import时,容器会仅执行该导入任务,任务完成后直接退出,不会自动启动Neo4j服务,因此容器处于停止状态。 - 重复导入冲突:重启容器时,Docker会重复执行启动命令中的
neo4j-admin import,但第一次导入的数据已保存在/data/databases/neo4j目录,而neo4j-admin import full默认不允许覆盖已有数据库,因此触发报错。 - 与社区版无关:该限制是
neo4j-admin import工具的通用规则,社区版和企业版均遵循此逻辑。
解决方法
方法1:分步骤执行导入与启动(推荐)
将导入和启动服务拆分为两个独立命令,避免重复执行导入:
- 执行导入任务,挂载数据卷保存结果,任务完成后自动删除临时容器:
docker run --rm \ --volume=C:/mydir/import:/import \ --volume=C:/mydir/neo4j-data:/data \ neo4j:5.11.0-community \ bin/neo4j-admin database import full --id-type=INTEGER --nodes=NodeA=/import/nodesa.csv --nodes=NodeB=/import/nodesb.csv --relationships=RELA=/import/rels.csv --multiline-fields=true
- 启动正常的Neo4j容器,挂载保存了导入数据的卷:
docker run -d --publish=7474:7474 --publish=7687:7687 \ --volume=C:/mydir/neo4j-data:/data \ --env NEO4J_AUTH=neo4j/password \ neo4j:5.11.0-community
方法2:单命令组合导入与启动
通过bash -c将导入命令和启动命令组合成一个容器启动命令:
docker run -d --publish=7474:7474 --publish=7687:7687 \ --volume=C:/mydir/import:/import \ --env NEO4J_AUTH=neo4j/password \ neo4j:5.11.0-community \ bash -c "bin/neo4j-admin database import full --id-type=INTEGER --nodes=NodeA=/import/nodesa.csv --nodes=NodeB=/import/nodesb.csv --relationships=RELA=/import/rels.csv --multiline-fields=true && bin/neo4j start"
注意:此方法仅适合首次执行,若容器重启会再次执行导入命令,仍会触发冲突,建议优先使用方法1。
方法3:覆盖已有数据库重新导入
如果需要重新导入数据,可在neo4j-admin import命令中添加--overwrite-destination参数,该参数会删除已有数据库后重新导入:
docker run --rm \ --volume=C:/mydir/import:/import \ --volume=C:/mydir/neo4j-data:/data \ neo4j:5.11.0-community \ bin/neo4j-admin database import full --overwrite-destination --id-type=INTEGER --nodes=NodeA=/import/nodesa.csv --nodes=NodeB=/import/nodesb.csv --relationships=RELA=/import/rels.csv --multiline-fields=true
执行前请确认已有数据可被覆盖。
内容的提问来源于stack exchange,提问作者iuhztr tzhjzuk
相关产品推荐
相关产品推荐

