You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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-

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 04:27:05