如何在docker-compose中通过init-db.js为MongoDB加载远程CSV数据
错误原因
你遇到的require未定义报错,是因为Mongo官方镜像中/docker-entrypoint-initdb.d/目录下的JS脚本是由Mongo Shell(mongosh)执行的,它不是Node.js运行环境,不支持CommonJS的require语法,也没有Node生态的第三方包,所以你参考的Node.js CSV解析代码完全无法在这个场景下运行。
方案1:使用Shell脚本 + mongoimport 完成导入(推荐)
官方Mongo镜像内置了curl、mongoimport工具,你可以直接用Shell脚本完成远程CSV拉取+导入,和你原有初始化逻辑完全兼容:
- 替换原有的
init-db.js为init-db.sh,内容如下:
#!/bin/bash # 拉取远程CSV到临时文件 curl -o /tmp/main.csv https://srv.example.com/main.csv # 导入CSV到指定库表 mongoimport --uri="mongodb://root:pass@localhost:27017/Exploit_Resources?authSource=admin" \ --collection EDB \ --type csv \ --headerline \ --drop \ --file /tmp/main.csv # 清理临时文件 rm -f /tmp/main.csv
参数说明:
--headerline:自动将CSV第一行作为字段名--drop:导入前清空集合,和你原有的db.EDB.drop()逻辑一致
- 修改
docker-compose.yml中db服务的volumes配置,挂载新的Shell脚本:
volumes: - ./init-db.sh:/docker-entrypoint-initdb.d/init-db.sh:ro
重新启动容器即可自动完成导入。
方案2:在Flask服务中完成初始化导入
如果你需要对CSV数据做自定义处理,可以把导入逻辑放在Flask服务启动阶段执行,Python实现示例:
import pandas as pd from pymongo import MongoClient # 连接MongoDB(host用docker-compose中定义的服务名db) client = MongoClient("mongodb://root:pass@db:27017/") db = client["Exploit_Resources"] # 仅当集合为空时执行导入,避免重复写入 if db.EDB.count_documents({}) == 0: # 读取远程CSV df = pd.read_csv("https://srv.example.com/main.csv") # 批量插入Mongo db.EDB.insert_many(df.to_dict("records"))
你可以把这段逻辑放在Flask启动代码的最前面,或者单独写为初始化脚本,在启动Flask服务前执行即可。
内容的提问来源于stack exchange,提问作者Incepnizer
相关产品推荐
相关产品推荐

