繁体   English   中英

通过 PyMongo 连接 Flask 到 Docker Compose 中的 MongoDB 时身份验证失败

[英]Failed Authentication when connecting with Flask through PyMongo to MongoDB in Docker Compose

我正在使用 Docker Compose 并尝试让两个容器相互通信。 一个运行 MongoDB 数据库,另一个运行 Flask 应用程序,需要使用 PyMongo 从第一个数据库读取数据。

Mongo 镜像定义如下 Dockerfile:


FROM mongo:6.0

ENV MONGO_INITDB_ROOT_USERNAME admin
ENV MONGO_INITDB_ROOT_PASSWORD admin-pwd
ENV MONGO_INITDB_DATABASE admin

COPY mongo-init.js /docker-entrypoint-initdb.d/

EXPOSE 27017

我的数据是通过以下 mongo-init.js 脚本加载的:

db.auth('admin','admin-pwd')

db = db.getSiblingDB('quiz-db')

db.createUser({
    user: 'quiz-admin',
    pwd: 'quiz-pwd',
    roles: [
        {
            role: 'readWrite',
            db: 'quiz-db'
        }
    ]
});

db.createCollection('questions');

db.questions.insertMany([
    {
        question: "Do you like sushi?",
        answers: {
            0:"Yes",
            1:"No",
            2:"Maybe"
        }
    }
]);

Flask 应用程序非常简单。 对于这个问题,我将跳过 Dockerfile,因为我认为这对问题并不重要。 我尝试使用以下代码连接到数据库:

from flask import Flask, render_template
from pymongo import MongoClient

app = Flask(__name__)

MONGO_HOST = "questions-db"
MONGO_PORT = "27017"
MONGO_DB = "quiz-db"
MONGO_USER = "quiz-admin"
MONGO_PASS = "quiz-pwd"
uri = "mongodb://{}:{}@{}:{}/{}?authSource=quiz-db".format(MONGO_USER, MONGO_PASS, MONGO_HOST, MONGO_PORT, MONGO_DB)

client = MongoClient(uri)
db=client["quiz-db"]
questions=list(db["questions"].find())

我不是 Mongo 方面的专家,但我已将 authSource 设置为“quiz-db”,因为这是我在“mongo-init.js”脚本中创建用户的数据库。 我尝试单独运行数据库容器,并且我确实以用户“quiz-db”使用 mongosh 成功登录。 所有数据都在那里,一切正常。

只有在尝试从 Flask 应用程序连接时才会出现问题。 这是我的 Docker 撰写文件:

version: '3.9'

services:
    #Flask App
    app:
        build: ./app
        ports:
            - "8000:5000"
        depends_on:
            - "questions-db"
        networks:
            - mongo-net
    
    #Mongo Database
    questions-db:
        build: ./questions_db
        hostname: questions-db
        container_name: questions-db
        ports:
            - "27017:27017"
        networks:
            - mongo-net

networks:
    mongo-net:
        driver: bridge

当我运行“docker compose up”时,我在 Flask 容器启动时收到以下错误:

pymongo.errors.OperationFailure: command find requires authentication
full error: {'ok': 0.0, 'errmsg': 'command find requires authentication', 'code': 13, 'codeName': 'Unauthorized'}

MongoDB 将所有用户凭据存储在管理数据库中,除非您使用的是非常古老的版本。

在 URI 中使用authSource=admin

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM