Ошибка 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 шт):

Автор решения: Slava65

Решил проблему через назначение статического 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:
→ Ссылка