Flask-SQLAlchemy与Docker数据库容器连接问题求助
Flask + Docker Compose 连接 MySQL 容器失败的解决方案
核心问题分析
你的连接问题主要来自三个关键点:
- 容器间通信端口配置错误
- Flask 启动早于 MySQL 初始化完成
- MySQL 8.0 认证插件与 mysqlconnector 兼容性问题
修复步骤
1. 修正数据库端口配置
容器之间通信使用容器内部端口,而非宿主机映射的端口。修改你的 .env 文件:
database_host = 'db' database_port = 3306 # 替换原3308,对应MySQL容器内部端口 database_user = 'root' database_psw = 'toor' database_schema = 'db_news'
2. 添加数据库健康检查与启动依赖
确保 Flask 容器在 MySQL 完全就绪后再启动,同时解决 MySQL 8.0 认证插件问题。修改 docker-compose.yml:
version: '3' services: db: container_name: mysqldb image: mysql:8.0.33 ports: - "3308:3306" environment: MYSQL_DATABASE: db_news MYSQL_ROOT_PASSWORD: toor MYSQL_ROOT_HOST: '%' # 强制使用兼容mysqlconnector的认证插件 MYSQL_INITDB_ARGS: "--default-authentication-plugin=mysql_native_password" volumes: - database_data:/var/lib/mysql networks: - default # 健康检查:确认数据库可正常连接 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-ptoor"] interval: 5s timeout: 5s retries: 5 app: container_name: app build: . ports: - "5000:4000" # 等待数据库服务健康后再启动 depends_on: db: condition: service_healthy volumes: - .:/app networks: - default volumes: database_data: networks: default: driver: bridge
3. 确保 Flask 正确加载环境变量
检查你的 Flask 代码是否正确读取 .env 文件:
from dotenv import load_dotenv import os from flask_sqlalchemy import SQLAlchemy load_dotenv() # 加载.env环境变量 app = Flask(__name__) db_user = os.getenv('database_user') db_psw = os.getenv('database_psw') db_host = os.getenv('database_host') db_port = os.getenv('database_port') db_schema = os.getenv('database_schema') app.config['SQLALCHEMY_DATABASE_URI'] = f'mysql+mysqlconnector://{db_user}:{db_psw}@{db_host}:{db_port}/{db_schema}?connect_timeout=60' db = SQLAlchemy(app)
4. 重新部署测试
执行以下命令清理旧容器并重新构建:
docker-compose down -v docker-compose up --build
查看容器日志,确认 Flask 应用成功连接 MySQL 数据库。
内容的提问来源于stack exchange,提问作者buscadv
相关产品推荐
相关产品推荐

