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

