ОБНОВЛЕНО с репозиторием:
Я создал простой репозиторий для проверки подключения к сервису 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...
Эта строка в документации 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
Теперь соединение работает как надо.