You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose中Flask通过PyMongo连接MongoDB认证失败

解决Docker Compose中Flask连接MongoDB的认证失败问题

问题分析

你遇到的command find requires authentication错误,核心原因是Flask容器启动早于MongoDB的初始化完成时间:虽然depends_on能保证MongoDB容器先启动,但无法确保它完成用户创建、数据插入等初始化操作。此时Flask尝试连接时,quiz-admin用户可能还未创建,导致认证失败。

解决方案

方案1:给Flask添加数据库连接重试逻辑

修改Flask代码,增加重试机制,等待MongoDB完全就绪后再执行查询:

from flask import Flask, render_template
from pymongo import MongoClient
from pymongo.errors import OperationFailure, ConnectionFailure
import time

app = Flask(__name__)

MONGO_HOST = "questions-db"
MONGO_PORT = 27017
MONGO_DB = "quiz-db"
MONGO_USER = "quiz-admin"
MONGO_PASS = "quiz-pwd"
uri = f"mongodb://{MONGO_USER}:{MONGO_PASS}@{MONGO_HOST}:{MONGO_PORT}/{MONGO_DB}?authSource={MONGO_DB}"

client = None
db = None
questions = []

def init_db():
    global client, db, questions
    max_retries = 10
    retry_delay = 2
    for attempt in range(max_retries):
        try:
            client = MongoClient(uri, serverSelectionTimeoutMS=5000)
            # 验证连接可用性
            client.admin.command('ping')
            db = client[MONGO_DB]
            questions = list(db["questions"].find())
            print("数据库连接成功,数据加载完成")
            break
        except (ConnectionFailure, OperationFailure) as e:
            print(f"连接失败,重试 {attempt+1}/{max_retries}:{str(e)}")
            time.sleep(retry_delay)
    else:
        raise Exception("多次重试仍无法连接数据库")

init_db()

# 示例路由
@app.route('/')
def index():
    return render_template('index.html', questions=questions)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

方案2:用Docker Compose健康检查控制启动顺序

在Compose配置中给MongoDB添加健康检查,让Flask等待MongoDB完全就绪后再启动:

  1. 修改questions-db服务配置,添加健康检查:
#Mongo Database
questions-db:
    build: ./questions_db
    hostname: questions-db
    container_name: questions-db
    ports:
        - "27017:27017"
    networks:
        - mongo-net
    healthcheck:
        test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')", "--username", "admin", "--password", "admin-pwd", "--authenticationDatabase", "admin"]
        interval: 5s
        timeout: 5s
        retries: 5
  1. 修改app服务的depends_on,依赖MongoDB的健康状态:
#Flask App
app:
    build: ./app
    ports:
        - "8000:5000"
    depends_on:
        questions-db:
            condition: service_healthy
    networks:
        - mongo-net

额外验证

确认你的MongoDB连接URI是正确的:authSource=quiz-db配置无误,因为quiz-admin用户是在quiz-db数据库下创建的,认证源必须匹配该数据库。

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 19:30:33