Node-приложению не удается подключиться к MongoDB, но только в Docker - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть два приложения:

Два приложения безупречно взаимодействуют, когда мое приложение узла запускается изначально. Теперь я поместил его в Docker-контейнер, и когда я запускаю оба вместе с docker compose up, бэкэнд не может подключиться к MongoDB.

Это фрагмент последовательности запуска:

mongodb_1   | 2018-11-10T22:22:52.481+0000 I NETWORK  [initandlisten] waiting for connections on port 27017
[...]
backend_1   | 2018-11-10T22:23:48.119Z 'MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]'

Это мой docker-compose.yml:

version: '2'
services:

  mongodb:
    image: bitnami/mongodb:latest
    expose:
      - 27017
    environment:
      - ALLOW_EMPTY_PASSWORD=yes

  backend:
    build: ./backend
    environment:
      API_HOST: http://localhost:3000/
      APP_SERVER_PORT: 3000
    expose:
      - 3000
    volumes:
      - ./backend:/app/backend
    links:
      - mongodb
    depends_on:
      - mongodb

Это мой узел вызова в БД:

mongoose.connect('mongodb://localhost:27017/groceryList', {
  useNewUrlParser: true
});

Я просмотрел около 15 вопросов Stackoverflow, задавая то же самое, и я не понимаю причину:

  • Дело не в том, что MongoDB не готов, когда мое приложение узла пытается подключения. Я завернул свой вызов подключения в автоматическое переподключение функционируйте как описано здесь и ошибка повторяется бесконечно. Это не только о "первом подключения».
  • Я могу опубликовать порт 27017 контейнера MongoDB и счастливо соединиться с Robo3T . БД определенно работает.
  • Когда я подключаюсь к mongodb://mongo:27017/groceryList вместо этого, применяется то же самое, только с флагом ENOTFOUND вместо ECONNREFUSED.

Что мне не хватает?

  • Докер 18.06.1-ке
  • docker-compose 1.22.0
  • Мангуст 5.3.6
  • MongoDB 4.0.3
  • Узел 11.1.0
  • macOS 10.14.1

1 Ответ

0 голосов
/ 11 ноября 2018

Ваш сервис mongodb называется mongodb, а не mongo.

Попробуйте

mongoose.connect('mongodb://mongodb:27017/groceryList', {
  useNewUrlParser: true
});

Общая форма: 'mongodb://mongoServiceName:27017/dbname', при этом используется автоматическое разрешение DNS докера для контейнеров в одной и той же сети.

И, как вы, возможно, уже знаете из других вопросов / ответов, в контейнере URL-адрес является относительным по отношению к самому себе, поэтому, поскольку внутри внутреннего контейнера не работает mongodb, он не может подключиться к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...