@Fakemrx

Как пройти аутентификацию при подключении к MongoDB?

Я использую Docker и mongo локально у меня нет, просто скачал из хаба последний образ, при сборке проекта и запуске никаких ошибок не возникает:
main.py:
"""Main file of all project"""
from fastapi import FastAPI
from dotenv import dotenv_values
from pymongo import MongoClient

config = dotenv_values(".env")

app = FastAPI()


@app.on_event("startup")
def startup_db_client():
    """Launches MongoDB after an app was started"""
    app.mongodb_client = MongoClient(config["DATABASE_URL"])
    app.database = app.mongodb_client[config["MONGO_INITDB_DATABASE"]]
    print("Connected to the MongoDB database!")


@app.on_event("shutdown")
def shutdown_db_client():
    """Shuts down DB after an app was stopped."""
    app.mongodb_client.close()
    print("MongoDB database connection were closed.")


@app.get("/ping")
def ping():
    return {"Test": app.database.list_collections()}


Но как только я пытаюсь зайти на 127.0.0.1:8000/ping, либо же произвожу любые действия с бд (достать, положить, посмотреть коллекции) даже на startup-е, то встречаю следующую ошибку:

...
File "/project/main.py", line 28, in ping
fastapi  |     return {"Test": app.database.list_collections()}
...
fastapi_container  | pymongo.errors.OperationFailure: Authentication failed., full error: {'ok': 0.0, 'errmsg': 'Authentication failed.', 'code': 18, 'codeName': 'AuthenticationFailed'}


.env:
MONGO_INITDB_ROOT_USERNAME=admin
MONGO_INITDB_ROOT_PASSWORD=admin
MONGO_INITDB_DATABASE=db
DATABASE_URL=mongodb://admin:admin@mongo:27017/db


docker-compose.yaml:
version: '3.9'

services:
  fastapi:
    build: .
    container_name: fastapi
    restart: always
    command: uvicorn main:app --host 0.0.0.0 --reload
    ports:
      - 8000:8000
    depends_on:
      - mongodb
    env_file:
      - .env
    volumes:
      - ./:/project/

  mongodb:
    image: mongo:latest
    container_name: mongo
    ports:
      - "27017:27017"
    restart: always
    env_file:
      - .env

  redis:
    image: redis:alpine
    container_name: redis


В чем может быть проблема? К монге user&pass отдаю и в uri, и при создании контейнера, в чем может быть дело?
  • Вопрос задан
  • 615 просмотров
Пригласить эксперта
Ответы на вопрос 2
SignFinder
@SignFinder
Wintel\Unix Engineer\DevOps
Потому, что к mongodb в другом контейнере не нужно обращаться по 127.0.0.1
Ответ написан
alexhadock
@alexhadock
Just a tech
Добавьте в docker-compose.yaml, в секцию "mongodb" параметр "hostname":
...
  mongodb:
    image: mongo:latest
    container_name: mongo
    hostname: mongo
    ports:
      - "27017:27017"
    restart: always
    env_file:
      - .env
...

Учтите, что Ваши контейнеры должны находиться в рамках одной сети и видеть друг друга. В настройке сети рекомендую обратиться к официальной документации по ссылке.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы