NestJS / Mongoose не удается установить соединение с базой данных MongoDB во время Docker compose

#mongodb #mongoose #docker-compose #nestjs

#mongodb #mongoose #docker-compose #nestjs

Вопрос:

При запуске моего docker-compose из экземпляра интерфейса, серверной части и mongo серверная часть не может подключиться к контейнеру mongo db.

Я использую Mongoose и NestJS на серверной части, код подключения выглядит следующим образом:

 const mongoUser = process.env.MONGO_USER;
const mongoPassword = process.env.MONGO_PASSWORD;
const mongoHostname = process.env.MONGO_HOSTNAME;
const mongoPort = process.env.MONGO_PORT;


const url = `mongodb://${mongoUser}:${mongoPassword}@${mongoHostname}:${mongoPort}`;

@Module({
  imports: [MongooseModule.forRoot(url, {
    useNewUrlParser: true,
    "user": process.env.MONGO_USER,
    "pass": process.env.MONGO_PASSWORD....
 

И соответствующий docker-compose.раздел yaml выглядит следующим образом:

   backend:
    container_name: backend
    build:
      context: ./backend
      dockerfile: Dockerfile
    ports:
      - 4001:4001
    depends_on:
      - mongo
    links:
      - mongo
    environment:
      MONGO_USER: root
      MONGO_PASSWORD: example
      MONGO_HOSTNAME: mongo
      MONGO_PORT: 27017
      PORT: 4001
    command: npm run start:dev

  mongo:
    image: mongo
    restart: always
    ports:
     - 27017:27017
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
 

В журналах контейнера я вижу, что предпринимается попытка подключения, но проверка подлинности завершается неудачно.

Вот журналы. Это странно, потому что порты среды работают и указывают на базу данных, но, по-видимому, MongoDB не распознает имя пользователя и пароль.

 backend          | [Nest] 34   - 01/05/2021, 9:09:49 PM   [InstanceLoader] JwtModule dependencies initialized  1ms
mongo_1          | {"t":{"$date":"2021-01-05T21:09:49.815 00:00"},"s":"I",  "c":"NETWORK",  "id":22943,   "ctx":"listener","msg":"Connection accepted","attr":{"remote":"172.18.0.5:47566","connectionId":4,"connectionCount":3}}
mongo_1          | {"t":{"$date":"2021-01-05T21:09:49.847 00:00"},"s":"I",  "c":"NETWORK",  "id":51800,   "ctx":"conn4","msg":"client metadata","attr":{"remote":"172.18.0.5:47566","client":"conn4","doc":{"driver":{"name":"nodejs|Mongoose","version":"3.6.3"},"os":{"type":"Linux","name":"linux","architecture":"x64","version":"4.19.76-linuxkit"},"platform":"'Node.js v14.15.4, LE (unified)","version":"3.6.3|5.11.9"}}}
mongo_1          | {"t":{"$date":"2021-01-05T21:09:49.856 00:00"},"s":"I",  "c":"NETWORK",  "id":22943,   "ctx":"listener","msg":"Connection accepted","attr":{"remote":"172.18.0.5:47568","connectionId":5,"connectionCount":4}}
mongo_1          | {"t":{"$date":"2021-01-05T21:09:49.876 00:00"},"s":"I",  "c":"NETWORK",  "id":51800,   "ctx":"conn5","msg":"client metadata","attr":{"remote":"172.18.0.5:47568","client":"conn5","doc":{"driver":{"name":"nodejs|Mongoose","version":"3.6.3"},"os":{"type":"Linux","name":"linux","architecture":"x64","version":"4.19.76-linuxkit"},"platform":"'Node.js v14.15.4, LE (unified)","version":"3.6.3|5.11.9"}}}
mongo_1          | {"t":{"$date":"2021-01-05T21:09:49.877 00:00"},"s":"I",  "c":"ACCESS",   "id":20251,   "ctx":"conn5","msg":"Supported SASL mechanisms requested for unknown user","attr":{"user":"undefined@admin"}}
mongo_1          | {"t":{"$date":"2021-01-05T21:09:49.877 00:00"},"s":"I",  "c":"ACCESS",   "id":20249,   "ctx":"conn5","msg":"Authentication failed","attr":{"mechanism":"SCRAM-SHA-256","principalName":"undefined","authenticationDatabase":"admin","client":"172.18.0.5:47568","result":"UserNotFound: Could not find user "undefined" for db "admin""}}
mongo_1          | {"t":{"$date":"2021-01-05T21:09:49.880 00:00"},"s":"I",  "c":"ACCESS",   "id":20249,   "ctx":"conn5","msg":"Authentication failed","attr":{"mechanism":"SCRAM-SHA-1","principalName":"undefined","authenticationDatabase":"admin","client":"172.18.0.5:47568","result":"UserNotFound: Could not find user "undefined" for db "admin""}}
mongo_1          | {"t":{"$date":"2021-01-05T21:09:49.883 00:00"},"s":"I",  "c":"NETWORK",  "id":22944,   "ctx":"conn4","msg":"Connection ended","attr":{"remote":"172.18.0.5:47566","connectionId":4,"connectionCount":3}}
backend          | [Nest] 34   - 01/05/2021, 9:09:49 PM   [MongooseModule] Unable to connect to the database. Retrying (1)...  73ms
 

Ответ №1:

Я улучшил вывод JSON из mongo и нашел UserNotFound: Could not find user "undefined" for db "admin" :

 {
  "t": {
    "$date": "2021-01-05T21:09:49.877 00:00"
  },
  "s": "I",
  "c": "ACCESS",
  "id": 20251,
  "ctx": "conn5",
  "msg": "Supported SASL mechanisms requested for unknown user",
  "attr": {
    "user": "undefined@admin"
  }
} {
  "t": {
    "$date": "2021-01-05T21:09:49.877 00:00"
  },
  "s": "I",
  "c": "ACCESS",
  "id": 20249,
  "ctx": "conn5",
  "msg": "Authentication failed",
  "attr": {
    "mechanism": "SCRAM-SHA-256",
    "principalName": "undefined",
    "authenticationDatabase": "admin",
    "client": "172.18.0.5:47568",
    "result": "UserNotFound: Could not find user "undefined" for db "admin""
  }
}
 

Согласно документации, имя базы данных должно быть в конце URL-адреса, например:

 url = mongodb://${mongoUser}:${mongoPassword}@${mongoHostname}:${mongoPort}/DB-NAME-HERE
 

Поскольку вы можете использовать параметры «user», «pass» и «dbName», я бы посоветовал удалить URL-адрес учетных данных или удалить параметры user и pass .

Комментарии:

1. Я перепробовал все комбинации, но получаю точно такие же ошибки. Похоже, что он вообще не получает учетные данные. Кроме того, удаление их из URL-адреса было бы невозможно, поскольку тогда URL-адрес не существовал бы?

2. Вы уверены, что добавили имя базы данных в конец URL-адреса? Все та же ошибка? У меня есть код, который работает с учетными данными в URL и без учетных данных в параметрах. Это та же архитектура, что и у вас, подключение к контейнеру mongo.

3. Привет, @bidetaggle, спасибо за вашу помощь. Ваш ответ правильный, но в то время он не работал, потому что я забыл перестроить свой образ docker, как клоун. Таким образом, изменения кода, которые я вносил, не отражались на изображении.

4. ха-ха, это хорошо, я рад, что вы решили свою проблему. Спасибо, что дали мне знать!