Проблема с подключением к сервису mongo в Gitlab ci

ОБНОВЛЕНО с репозиторием:

Я создал простой репозиторий для проверки подключения к сервису mongo в GitLab CI.

Адрес репозитория: https://gitlab.com/arashchm/mongodb

Проблема в том, что основной контейнер не может получить доступ к контейнеру, в котором есть mongodb.

Вот содержание .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.info("Connected successfully to MongoDB");
        // Your database interaction logic here
    } catch (err) {
        console.error("Failed to connect to MongoDB:", err);
        process.exit(1);
    }
}

run()

В журналах CI я вижу, что контейнер службы запущен, и есть 30 секунд времени, чтобы убедиться, что он работает:

Похоже, возникла проблема с подключением к IPv6:

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
    }
  }
}

🤔 А знаете ли вы, что...
MongoDB является открытым исходным кодом и доступна под лицензией GNU AGPL...


1
50
1

Ответ:

Решено

Эта строка в документации MongoDB помогла:

mongod по умолчанию отключает поддержку IPv6.

Итак, я внес это изменение:

test-mongo:
  services:
    - name: mongo:latest
      alias: mongo
      command:
        - mongod
        - --ipv6
  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

Теперь соединение работает как надо.