#node.js #mongodb #docker
#node.js #mongodb #docker
Вопрос:
У меня возникли некоторые проблемы при подключении к mongodb с помощью docker и драйвера NodeJS.
Вот мой файл docker-compose.yml:
version: "3.3"
services:
mongodb:
image: mongo:4.0.20
ports:
- 27017:27017
command: mongod --replSet rs0
deploy:
replicas: 1
restart_policy:
condition: "on-failure"
И я запускаю свой сервис с
docker stack deploy -c ./docker-compose.yml --with-registry-auth XXX
Затем, когда я уверен, что mongo хорошо запущен, я запускаю:
docker exec $(docker ps -q -f name=mongodb) mongo local --eval "rs.initiate()"
которые инициализируют набор replicat.
Вот мой тестовый файл nodejs:
const MongoClient = require('mongodb');
(async () => {
let db;
try {
db = (await MongoClient(
'mongodb://localhost:27017/qos',
{
useNewUrlParser: true,
useUnifiedTopology: true
}
)).db();
console.log('connected');
} catch (error) {
console.trace(error)
}
})()
Но когда я запускаю test.js файл, я вижу:
Trace: MongoServerSelectionError: getaddrinfo ENOTFOUND 272b05abb632
at Timeout._onTimeout (node_modules/mongodb/lib/core/sdam/topology.js:438:30)
at listOnTimeout (internal/timers.js:554:17)
at processTimers (internal/timers.js:497:7) {
reason: TopologyDescription {
type: 'ReplicaSetNoPrimary',
setName: 'rs0',
maxSetVersion: 1,
maxElectionId: 7fffffff0000000000000001,
servers: Map { 'bcc9e46ea248:27017' => [ServerDescription] },
stale: false,
compatible: true,
compatibilityError: null,
logicalSessionTimeoutMinutes: null,
heartbeatFrequencyMS: 10000,
localThresholdMS: 15,
commonWireVersion: 7
}
}
at test.js:15:13
Я проверяю, что 272b05abb632
это правильный идентификатор контейнера,
и в моем процессе docker я вижу:
2020-11-10T16:34:49.019360315Z XXX_mongodb.1.awsb46tji1lg@docker-desktop | 2020-11-10T16:34:49.018 0000 I NETWORK [listener] connection accepted from 10.0.0.2:49082 #4 (2 connections now open)
2020-11-10T16:34:49.027564962Z XXX_mongodb.1.awsb46tji1lg@docker-desktop | 2020-11-10T16:34:49.027 0000 I NETWORK [conn4] received client metadata from 10.0.0.2:49082 conn4: { driver: { name: "nodejs", version: "3.6.3" }, os: { type: "Darwin", name: "darwin", architecture: "x64", version: "19.6.0" }, platform: "'Node.js v12.19.0, LE (unified)" }
2020-11-10T16:34:49.033185739Z XXX_mongodb.1.awsb46tji1lg@docker-desktop | 2020-11-10T16:34:49.032 0000 I NETWORK [conn4] end connection 10.0.0.2:49082 (1 connection now open)
Я не понимаю, почему с useUnifiedTopology это не работает: (
Я прошу вашей помощи!
Я также пытался добавить mongod.conf в свой контейнер через docker-compose, но это тоже не работает:
version: "3.3"
services:
mongodb:
image: mongo:4.0.20
ports:
- 27017:27017
command: mongod --config /etc/mongod.conf
volumes:
- "./mongod.conf:/etc/mongod.conf"
deploy:
replicas: 1
restart_policy:
condition: "on-failure"
security:
authorization: 'enabled'
net:
port: 27017
bindIp: 0.0.0.0 #default value is 127.0.0.1
replication:
replSetName: rs0
Комментарии:
1. ваш сервер mongodb работает не на локальном хосте, а на IP-адресе контейнера. Рассмотрите возможность создания контейнера для кода вашего узла, а для строки подключения используйте имя контейнера mongo вместо localhost
2. Какую версию mongodb вы используете. У меня возникла эта проблема с версией> 4. Я решил это, используя version
3.6.10