GitLab CI主容器无法连接MongoDB服务的问题
GitLab CI中主容器无法连接MongoDB服务容器的解决方案
问题重现
我在GitLab CI中配置了MongoDB服务,但主容器(Node.js环境)无法连接MongoDB,CI日志显示MongoDB已启动就绪,但出现IPv6连接拒绝错误。相关配置及错误信息如下:
.gitlab-ci.yml配置
test-mongo: services: - name: mongo:latest alias: mongo variables: MONGO_INITDB_DATABASE: custom_db MONGO_INITDB_ROOT_USERNAME: custom_user MONGO_INITDB_ROOT_PASSWORD: custom_pass image: node:18.19-bullseye script: - npm install - node ./test-db.js
本地正常运行的docker-compose.yml
services: mongo: image: mongo:latest container_name: mongo environment: MONGO_INITDB_ROOT_USERNAME: custom_user MONGO_INITDB_ROOT_PASSWORD: custom_pass MONGO_INITDB_DATABASE: custom_db ports: - "27017:27017" app: image: node:18.19-bullseye container_name: app volumes: - .:/usr/src/app working_dir: /usr/src/app command: bash -c "npm install && node test-db.js" depends_on: - mongo
test-db.js代码
import {MongoClient} from 'mongodb'; const uri = 'mongodb://custom_user:custom_pass@mongo:27017/custom_db?authSource=admin'; async function run() { const client = new MongoClient(uri); try { await client.connect(); console.log("Connected successfully to MongoDB"); } catch (err) { console.error("Failed to connect to MongoDB:", err); process.exit(1); } } run()
CI错误日志
MongoServerSelectionError: connect ECONNREFUSED fd76:5338:4685:1:0:242:ac11:3:27017 at Topology.selectServer (/builds/arashchm/mongodb/node_modules/mongodb/lib/sdam/topology.js:303:38) at async Topology._connect (/builds/arashchm/mongodb/node_modules/mongodb/lib/sdam/topology.js:196:28) at async Topology.connect (/builds/arashchm/mongodb/node_modules/mongodb/lib/sdam/topology.js:158:13) at async topologyConnect (/builds/arashchm/mongodb/node_modules/mongodb/lib/mongo_client.js:204:17) at async MongoClient._connect (/builds/arashchm/mongodb/node_modules/mongodb/lib/mongo_client.js:217:13) at async MongoClient.connect (/builds/arashchm/mongodb/node_modules/mongodb/lib/mongo_client.js:142:13) at async run (file:///builds/arashchm/mongodb/test-db.js:8:9) { reason: TopologyDescription { type: 'Unknown', servers: Map(1) { 'mongo:27017' => [ServerDescription] }, stale: false, compatible: true, heartbeatFrequencyMS: 10000, localThresholdMS: 15, setName: null, maxElectionId: null, maxSetVersion: null, commonWireVersion: 0, logicalSessionTimeoutMinutes: null }, code: undefined, [Symbol(errorLabels)]: Set(0) {}, [cause]: MongoNetworkError: connect ECONNREFUSED fd76:5338:4685:1:0:242:ac11:3:27017 at connectionFailureError (/builds/arashchm/mongodb/node_modules/mongodb/lib/cmap/connect.js:353:20) at Socket.<anonymous> (/builds/arashchm/mongodb/node_modules/mongodb/lib/cmap/connect.js:268:44) at Object.onceWrapper (node:events:632:26) at Socket.emit (node:events:517:28) at emitErrorNT (node:internal/streams/destroy:151:8) at emitErrorCloseNT (node:internal/streams/destroy:116:3) at process.processTicksAndRejections (node:internal/process/task_queues:82:21) { [Symbol(errorLabels)]: Set(1) { 'ResetPool' }, [cause]: Error: connect ECONNREFUSED fd76:5338:4685:1:0:242:ac11:3:27017 at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1555:16) { errno: -111, code: 'ECONNREFUSED', syscall: 'connect', address: 'fd76:5338:4685:1:0:242:ac11:3', port: 27017 } } }
问题原因
错误显示Node.js客户端尝试通过IPv6地址连接MongoDB,但GitLab CI的默认网络环境通常禁用IPv6,且MongoDB默认可能未监听IPv6地址,导致连接被拒绝。
解决方案
1. 强制MongoDB监听IPv4地址
修改.gitlab-ci.yml中MongoDB服务的启动命令,让mongod仅监听IPv4:
test-mongo: services: - name: mongo:latest alias: mongo command: ["mongod", "--bind_ip", "0.0.0.0"] # 新增该行 variables: MONGO_INITDB_DATABASE: custom_db MONGO_INITDB_ROOT_USERNAME: custom_user MONGO_INITDB_ROOT_PASSWORD: custom_pass image: node:18.19-bullseye script: - npm install - node ./test-db.js
2. 强制Node.js使用IPv4解析
两种方式二选一:
- 修改连接字符串:在MongoDB URI中添加
family=4参数,强制使用IPv4:const uri = 'mongodb://custom_user:custom_pass@mongo:27017/custom_db?authSource=admin&family=4'; - 启动Node时指定参数:在CI脚本中启动Node时添加
--dns-result-order=ipv4first:script: - npm install - node --dns-result-order=ipv4first ./test-db.js
3. 增加MongoDB就绪检查(可选但推荐)
虽然GitLab CI默认等待服务启动30秒,但有时服务可能未完全就绪,可添加手动检查:
script: - apt-get update && apt-get install -y netcat - while ! nc -z mongo 27017; do sleep 1; echo "Waiting for MongoDB..."; done # 等待MongoDB端口开放 - npm install - node ./test-db.js
内容的提问来源于stack exchange,提问作者Eclipse-
相关产品推荐
相关产品推荐

