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
相关产品推荐
相关产品推荐

