使用Docker运行Mongo脚本时无法连接127.0.0.1:27017服务器
解决Docker中运行Mongo脚本连接失败的问题
这个坑我之前踩过!你当前的命令直接启动了MongoDB shell客户端,但容器内部根本没有运行mongod服务进程,所以shell尝试连接容器内的127.0.0.1:27017时自然会被拒绝。下面给你两种实用的解决方案:
方案一:分离服务容器与脚本容器(推荐)
这种方式更符合Docker的容器单职责原则,而且服务容器可以复用:
- 先启动一个后台运行的MongoDB服务容器,给它起个易识别的名字:
docker run -d --name mongo-service mongo:latest - 再运行你的脚本容器,指定连接到刚才启动的服务容器(而不是本地127.0.0.1):
原理:Docker会自动维护容器间的内部DNS,docker run --rm -it --volume "$(pwd):/scripts" mongo:latest mongo --host mongo-service /scripts/${SCRIPT_FILE_NAME}mongo-service这个容器名会被解析到对应的容器IP,脚本就能正常连接到运行中的MongoDB服务了。
方案二:在同一个容器内启动服务并执行脚本(适合一次性任务)
如果只是临时跑一次脚本,不想保留服务容器,可以用shell命令串让容器先启动mongod,等服务就绪后再执行脚本:
docker run --rm -v "$(pwd):/scripts" mongo:latest sh -c "mongod --fork --logpath /tmp/mongo.log && mongo /scripts/${SCRIPT_FILE_NAME} && mongod --shutdown"
命令拆解:
mongod --fork --logpath /tmp/mongo.log:让MongoDB服务后台运行,日志输出到临时文件- 等服务启动完成后,执行你的Mongo脚本
- 脚本执行完毕后,关闭MongoDB服务,容器自动退出
额外小提示
- 如果你的脚本需要指定数据库、用户名或密码,可以在
mongo命令后补充参数,比如:mongo --host mongo-service my-target-db -u my-user -p my-pass /scripts/${SCRIPT_FILE_NAME} - Windows环境下注意路径变量:PowerShell里用
${PWD}替代$(pwd),CMD里用%cd%替代。
内容的提问来源于stack exchange,提问作者Yasin Mansour
相关产品推荐
相关产品推荐

