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

Docker-Compose环境下Flask应用无法连接warehouse_db MySQL容器

Flask容器无法连接Docker-Compose中的warehouse_db容器排查方案

可能的原因及解决步骤

1. 检查Flask应用的数据库连接配置

容器内通过mysql -h warehouse_db -uroot -p能成功连接,说明网络通信正常,优先排查代码中的配置错误:

  • 确认主机名是否为warehouse_db(与docker-compose中服务名一致,不要用IP或宿主机端口);
  • 核对端口号:容器间通信使用MySQL容器内部端口(默认3306),不要用宿主机映射的外部端口;
  • 检查用户名、密码、目标数据库名:是否与warehouse_db的实际配置匹配,避免误复用了db的凭证;
  • 示例正确配置(以SQLAlchemy为例):
    WAREHOUSE_DB_URI = "mysql+pymysql://root:warehouse_password@warehouse_db:3306/warehouse_db"
    

2. 验证warehouse_db的初始化状态

如果warehouse_db使用了初始化脚本(如docker-entrypoint-initdb.d下的SQL文件),确认脚本执行是否正确:

  • 检查是否创建了目标数据库:
    CREATE DATABASE IF NOT EXISTS warehouse_db;
    
  • 确认用户权限配置(允许容器内访问):
    GRANT ALL PRIVILEGES ON warehouse_db.* TO 'root'@'%' IDENTIFIED BY 'your_password';
    FLUSH PRIVILEGES;
    
  • 可以进入warehouse_db容器查看数据库状态:
    docker-compose exec warehouse_db mysql -uroot -p -e "SHOW DATABASES;"
    

3. 处理数据库就绪延迟问题

depends_on仅保证容器启动顺序,不确保MySQL服务完全就绪,warehouse_db可能启动较慢导致Flask连接失败:

  • 在Flask连接代码中添加重试逻辑:
    import time
    from sqlalchemy import create_engine
    from sqlalchemy.exc import OperationalError
    
    def get_warehouse_engine():
        retries = 5
        while retries > 0:
            try:
                engine = create_engine(WAREHOUSE_DB_URI)
                with engine.connect():
                    return engine
            except OperationalError:
                retries -= 1
                time.sleep(2)
        raise RuntimeError("无法连接warehouse_db,重试次数耗尽")
    
  • 或在容器启动时使用wait-for-it工具等待MySQL就绪(需在app的Dockerfile中安装该工具)。

4. 检查环境变量传递是否正确

如果通过环境变量配置数据库连接,确认变量是否正确传入app容器:

  • 进入app容器查看相关环境变量:
    docker-compose exec app env | grep WAREHOUSE
    
  • 核对变量值是否与warehouse_db的配置一致,避免变量名拼写错误或值未正确设置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:33:12