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

无法从Docker容器连接MySQL镜像,Access Denied错误解决求助

解决Docker Compose中FastAPI连接MySQL失败的问题

核心错误分析

你的连接问题主要由以下几个原因导致:

  • 数据库名称不匹配
  • MySQL健康检查未携带密码
  • 初始化脚本与环境变量冲突
  • 日志中存在拼写错误

具体修复步骤

1. 修正数据库名称不匹配

Python连接代码中指定的数据库是efs_customer,但docker-compose里初始化的数据库是test_db,两者不匹配。修改Python代码中的DATABASE_URL:

# 原代码
DATABASE_URL = "mysql+pymysql://root:root@mysql:3306/efs_customer"

# 修改后
DATABASE_URL = "mysql+pymysql://root:root@mysql:3306/test_db"

2. 修复MySQL健康检查命令

当前健康检查未携带root密码,导致出现Access denied for user 'root'@'localhost' (using password: NO)错误。更新docker-compose.yml中的healthcheck配置:

# 原配置
healthcheck:
  test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
  interval: 10s
  timeout: 5s
  retries: 5

# 修改后
healthcheck:
  test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "--password=${MYSQL_ROOT_PASSWORD}"]
  interval: 10s
  timeout: 5s
  retries: 5

这样会使用容器中已设置的MYSQL_ROOT_PASSWORD环境变量进行认证。

3. 简化MySQL初始化脚本

init.sql中的ALTER USER 'root'@'localhost'语句多余,因为MYSQL_ROOT_PASSWORD环境变量已经初始化了root密码。同时CREATE USER 'root'@'%'也不需要,MYSQL_ROOT_HOST='%'已经允许root从任意主机连接。简化后的init.sql:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

4. 清理旧数据卷(可选但建议)

如果之前运行过容器,可能存在旧的数据库数据导致配置冲突。执行以下命令删除现有数据卷,重新初始化:

docker-compose down -v
docker-compose up --build

验证修复

完成以上修改后,重新启动服务:

docker-compose up --build

此时FastAPI应该能正常连接MySQL容器,不再出现权限错误和连接中断日志。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:10:14