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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:02:28