GitLab CI无法连接Docker部署的MongoDB问题求助
嘿,我来帮你梳理下这个连接失败的问题,主要是两个核心点出了错:GitLab CI Job的网络隔离机制,还有Docker Compose配置里的参数混淆,咱们一步步来搞定:
1. 先修正Docker Compose里的明显错误
看你的MongoDB服务配置,environment块里重复写了MONGO_INITDB_DATABASE,第二个值password直接覆盖了第一个mybase,这会导致MongoDB初始化的数据库变成password,完全不是你想要的mybase。另外,你设置root密码的逻辑也有点混淆,把密码和数据库名搞混了。修正后的配置应该是这样:
give_sync_test: image: mongo:4.2.10 restart: always environment: MONGO_INITDB_DATABASE: mybase # 这是你要初始化的目标数据库 MONGO_INITDB_ROOT_USERNAME: admin # 明确root用户名,默认也是root,但写上更清晰 MONGO_INITDB_ROOT_PASSWORD: password # 这是root用户的登录密码 ports: - 27017:27017
2. GitLab CI无法连接MongoDB的核心原因:网络隔离
这是最容易踩坑的点:GitLab CI的每个Job都是运行在独立的Docker容器里的,这些容器和你用docker-compose up启动的MongoDB容器根本不在同一个网络环境里!所以你在Job里用localhost:27017去访问,相当于在自己的Job容器里找MongoDB,当然会连接拒绝。
这里给你两种可行的解决办法:
方案一:在GitLab CI Job里直接启动MongoDB(推荐)
不需要依赖外部启动的容器,直接用GitLab CI的services字段在test阶段启动MongoDB服务,这样Job容器和MongoDB容器会自动加入同一个内部网络,直接用服务名就能访问:
test: stage: test dependencies: - maven_build_snapshot image: 'my_image:latest' # 在这里启动MongoDB服务 services: - name: mongo:4.2.10 alias: mongodb # 给服务起个别名,方便后面连接 # 设置MongoDB的初始化参数 variables: MONGO_INITDB_DATABASE: mybase MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD: password before_script: - apt-get update - apt-get -y install git mongodb-clients # 确保安装了mongo客户端工具 script: # 注意这里用的是服务别名mongodb,不是localhost - mongo "mongodb://admin:password@mongodb:27017/mybase" < ./utils/test
另外提醒下:你的utils/test里写的是use myBase;,MongoDB在Linux环境下数据库名是区分大小写的,你初始化的是mybase,这里写成myBase会创建一个新的空数据库,建议改成use mybase;保持一致。
方案二:让Job容器加入外部MongoDB的网络
如果你一定要用之前docker-compose启动的那个MongoDB,得让GitLab Runner的Job容器加入到MongoDB所在的Docker网络里:
先查一下你的MongoDB容器所在的网络名称:
docker network ls # 通常docker-compose创建的网络是<你的项目目录名>_default,比如你的项目叫give_sync,那网络名就是give_sync_default然后在GitLab CI的Job配置里指定这个网络,同时用MongoDB的服务名(
give_sync_test)作为主机名访问:test: stage: test dependencies: - maven_build_snapshot image: 'my_image:latest' # 指定要加入的Docker网络 network: <你的docker-compose网络名称> before_script: - apt-get update - apt-get -y install git mongodb-clients script: # 这里用服务名give_sync_test代替localhost - mongo "mongodb://admin:password@give_sync_test:27017/mybase" < ./utils/test
最后再检查下
把上面的配置改完后,记得先重启你的docker-compose服务,然后重新跑GitLab CI的test Job,应该就能正常连接了。
内容的提问来源于stack exchange,提问作者RVA

