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

Docker化Flask应用连接MySQL数据库遭遇连接问题

Docker化Flask应用连接MySQL数据库的问题解决

以下是针对你遇到的连接问题的具体解决方案:

1. 解决MySQL未就绪时Flask提前连接的问题

depends_on仅保证db服务先启动,但MySQL启动后需要完成初始化才能接受连接,Flask可能在服务就绪前就发起连接导致拒绝。可以在Flask代码中添加重试逻辑:

from sqlalchemy import create_engine
from sqlalchemy.exc import OperationalError
import time

def init_db_engine():
    engine = None
    retry_count = 5
    while retry_count > 0:
        try:
            engine = create_engine('mysql+pymysql://root:root@db:3306/people')
            # 尝试建立连接验证服务是否就绪
            with engine.connect():
                print("数据库连接成功")
                break
        except OperationalError:
            retry_count -= 1
            print(f"数据库尚未就绪,{retry_count}次重试剩余...")
            time.sleep(2)
    if not engine:
        raise RuntimeError("无法连接到数据库,请检查MySQL服务状态")
    return engine

engine = init_db_engine()
df = pd.read_sql_query("SELECT * FROM people_data", engine)

2. 自动创建目标数据库people

你本地运行Flask时可能手动创建了people数据库,但Docker启动的MySQL默认不会自动生成该库。修改docker-compose.yml的db服务环境变量,让MySQL启动时自动创建数据库:

version: '3.1'

services:
   db:
    image: mysql:8.0.33-debian
    command: --default-authentication-plugin=mysql_native_password
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: people  # 新增:自动创建people数据库
    volumes:
      - C:/Databases/mysql_flask_test:/var/lib/mysql

   app:
    build: '.'
    ports:
      - 5000:5000
    depends_on:
      - db

3. 验证MySQL绑定地址(可选)

确保MySQL允许来自容器网络的连接,虽然官方镜像默认已配置,但可以显式指定绑定地址:

command: --default-authentication-plugin=mysql_native_password --bind-address=0.0.0.0

4. 检查挂载卷的数据库数据

你挂载了本地目录到MySQL的数据目录,如果该目录中的数据没有people库或存在权限问题,也会导致连接失败。可以暂时注释掉volumes配置,测试是否是本地卷的问题:

# volumes:
#   - C:/Databases/mysql_flask_test:/var/lib/mysql

如果注释后能正常连接,说明本地卷中的数据异常,需要清理或重新初始化该目录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:01:33