docker-compose部署的MongoDB服务如何导入数据?mongoimport连接失败如何解决?
问题根因分析
你配置中的核心错误如下:
- 直接覆盖了MongoDB服务的默认启动命令为
mongoimport,导致MongoDB服务本身根本没有启动,自然无法连接到数据库实例 - 端口映射配置错误:MongoDB默认服务端口为27017,你配置的
27107:27107既不匹配默认端口,也和你mongoimport里写的27017端口不一致 - mongoimport参数错误:不需要加
http://前缀,且你配置了数据库账号密码,导入命令未携带认证参数 - 不要把导入用的csv、json等文件放到
/data/db路径下,该目录是MongoDB存储自身引擎数据的专属目录,混入普通文件容易导致数据库运行异常
可行导入方案
方案1:初始化脚本自动导入(推荐,首次启动时自动执行)
MongoDB官方镜像支持将初始化脚本放入/docker-entrypoint-initdb.d/目录,数据库首次启动完成后会自动执行该目录下的所有.sh/.js脚本。
操作步骤:
- 本地新建
init目录,将你的tt.csv和导入脚本import.sh放入该目录 import.sh内容参考:
#!/bin/bash mongoimport --host localhost:27017 \ -u root -p example \ --authenticationDatabase admin \ -d appdb -c col1 \ --type csv --file /init/tt.csv --headerline
- 修改docker-compose.yml中mongodb服务配置,删除原来的
command字段,修改端口映射,新增初始化目录挂载:
mongodb: image: mongo:3.6 container_name: mongodb restart: on-failure environment: - MONGO_INITDB_ROOT_USERNAME=root - MONGO_INITDB_ROOT_PASSWORD=example volumes: - ./mongodbvol:/data/db - ./init:/init # 挂载本地初始化目录到容器 ports: - "27017:27017" # 修正端口映射
- 删除本地已生成的
./mongodbvol目录(避免已经初始化过不执行脚本),重新执行docker-compose up -d即可自动完成数据导入
方案2:手动执行导入(适合已运行的数据库)
等mongodb容器启动成功后,直接通过docker exec命令进入容器执行导入操作,命令参考:
docker exec -it mongodb mongoimport \ --host localhost:27017 \ -u root -p example \ --authenticationDatabase admin \ -d appdb -c col1 \ --type csv --file /data/db/tt.csv --headerline
方案3:独立导入服务(无需修改原有MongoDB配置)
在docker-compose.yml中新增一个专门用于导入的服务,启动后自动执行导入,完成后退出,配置参考:
mongo-import: image: mongo:3.6 container_name: mongo-import depends_on: - mongodb volumes: - ./init:/init # 挂载你的数据文件目录 command: > bash -c "mongoimport --host mongodb:27017 \ -u root -p example \ --authenticationDatabase admin \ -d appdb -c col1 \ --type csv --file /init/tt.csv --headerline"
补充注意
修改完配置后记得同步修正rshiny服务里的DB_PORT参数为27017,和MongoDB实际端口保持一致。
内容的提问来源于stack exchange,提问作者Guilherme Viegas
相关产品推荐
相关产品推荐

