Ошибка new ServerSelectionError() при обращении фронта к api сайта на Docker
Есть фулстек приложение сайта (React, Node, Mongo). Я его докеризирую.
//docker-compose.yml
services:
web:
build: ./movies-explorer-frontend
depends_on:
- api
ports:
- "3000:3000"
networks:
- network-backend
api:
build: ./movies-explorer-api
depends_on:
- mongo
ports:
- "3001:3001"
networks:
- network-backend
mongo:
image: mongo
restart: always
volumes:
- mongodb_data:/data/db
- ./scripts:/docker-entrypoint-initdb.d
environment:
MONGODB_INITDB_ROOT_USERNAME: username
MONGODB_INITDB_ROOT_PASSWORD: password
networks:
- network-backend
networks:
network-backend:
volumes:
mongodb_data:
//mongo-init.js
db=db.getSiblingDB('admin');
db.auth('root','root')
db=db.getSiblingDB('bitfilmsdb')
db.createUser({
'user': "user",
'pwd': "user",
'roles': [{
'role': 'dbOwner',
'db': 'bitfilmsdb'
}]
})
db.createCollection('movies');
db.createCollection('users')
Из строки подключения к БД в api убрал localhost (вероятная причина ошибки), стало:
const { DB_PATH = 'mongodb://127.0.0.1:27017/bitfilmsdb' } = process.env;
При первом обращении фронта к api контейнер api все равно останавливается с ошибкой:
/usr/src/app/node_modules/mongoose/lib/connection.js:847
2024-05-25 14:53:07 const serverSelectionError = new ServerSelectionError();
Подскажите, какая еще может быть причина?
Дополнение: при тестировании контейнера БД локально, запустив по отдельности бэк и фронт через VS Code в терминале увидел, что для моей сети вместо localhost используется другой ip (не 127.0.0.1). Поменяв строку подключения к БД все заработало. Видимо это ip, который присваивает оператор, так как он постоянно меняется. Но тогда как сделать универсальное решение для любого компьютера?
Ответы (1 шт):
Решил проблему через назначение статического ip для контейнера mongo с помощью встроенной DNS-службы Docker, как указано в ссылке: https://www.baeldung.com/ops/docker-communicating-with-containers-on-same-machine
//docker-compose.yml
services:
web:
build: ./movies-explorer-frontend
depends_on:
- api
ports:
- "3000:3000"
networks:
- network-backend
api:
build: ./movies-explorer-api
depends_on:
- mongo
ports:
- "3001:3001"
networks:
- network-backend
mongo:
image: mongo
restart: always
volumes:
- mongodb_data:/data/db
- ./scripts:/docker-entrypoint-initdb.d
environment:
MONGODB_INITDB_ROOT_USERNAME: username
MONGODB_INITDB_ROOT_PASSWORD: password
networks:
network-backend:
ipv4_address: 10.5.0.2
networks:
network-backend:
driver: bridge
ipam:
config:
- subnet: 10.5.0.0/16
gateway: 10.5.0.1
volumes:
mongodb_data: