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

Docker容器中Flask应用无法连接MariaDB的问题求助

解决Docker Compose下Flask连接MariaDB的权限问题

针对报错Host '172.21.0.3' is not allowed to connect to this MariaDB server,以下是具体解决步骤:

1. 手动更新MariaDB用户访问权限

这是快速验证问题的临时修复方式:

  • 进入运行中的MariaDB容器:
    docker exec -it <mariadb-container-name> mysql -u root -p
    
    替换<mariadb-container-name>为你的compose中MariaDB服务名称(比如db),输入数据库root密码后进入客户端。
  • 执行授权命令,允许指定用户从任意主机访问目标数据库:
    GRANT ALL PRIVILEGES ON <your-database-name>.* TO '<your-db-user>'@'%' IDENTIFIED BY '<your-db-password>';
    FLUSH PRIVILEGES;
    
    替换占位符为实际数据库名、用户名和密码。若需更严格权限,可将%替换为容器所在子网段(如172.21.0.%)。
  • 退出客户端后重启Flask容器测试连接。

2. 用初始化脚本自动配置权限

适合长期部署,避免手动重复操作:

  • 在项目根目录创建init.sql文件,写入授权语句:
    GRANT ALL PRIVILEGES ON your_database.* TO 'your_user'@'%' IDENTIFIED BY 'your_password';
    FLUSH PRIVILEGES;
    
  • 修改docker-compose.yml中MariaDB服务配置,挂载初始化脚本:
    services:
      db:
        image: mariadb
        volumes:
          - ./init.sql:/docker-entrypoint-initdb.d/init.sql
          # 保留原有数据卷挂载配置
        environment:
          # 你的数据库环境变量(MYSQL_ROOT_PASSWORD、MYSQL_DATABASE等)
    
  • 注意:脚本仅在数据库首次初始化(数据卷为空)时执行,若已有旧数据卷需先清理:
    docker-compose down -v
    
  • 重新启动容器:docker-compose up -d

3. 修正Flask的数据库连接字符串

确保使用Docker Compose服务名作为数据库主机,而非localhost或固定IP:

  • Flask数据库URL应类似:
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://your_user:your_password@db/your_database'
    
    这里的db是你在docker-compose.yml中MariaDB服务的名称,Docker Compose会通过内部DNS自动解析服务名为对应容器IP。

4. 确保MariaDB监听所有地址

检查MariaDB是否因绑定127.0.0.1无法接收容器网络连接:

  • 在docker-compose.yml的MariaDB服务中添加启动命令,强制绑定所有地址:
    services:
      db:
        image: mariadb
        command: --bind-address=0.0.0.0
        # 其他配置...
    
  • 也可挂载自定义my.cnf配置文件,设置bind-address=0.0.0.0:
    volumes:
      - ./my.cnf:/etc/mysql/my.cnf
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:05:53