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完全就绪后再启动:
- 修改
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
- 修改
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
相关产品推荐
相关产品推荐

