Docker部署Laravel应用遇MySQL root用户权限拒绝错误求助
解决Laravel容器化MySQL权限拒绝问题
核心问题分析
错误提示SQLSTATE[HY000] [1045] Access denied for user 'root'@'172.18.0.3',本质是MySQL的root用户默认仅允许从容器内部localhost访问,而Laravel容器从Docker网络IP(172.18.0.3)发起连接,权限不匹配;此外可能存在数据库服务未完全就绪就被Laravel连接、旧数据卷缓存残留配置的问题。
分步解决方案
1. 调整MySQL用户配置
避免使用root作为业务连接用户,改用独立业务用户,同时分离root密码与业务用户密码:
修改docker-compose.yml的数据库服务环境变量:
database: image: mysql:8.2 ports: - 3306:3306 environment: - MYSQL_DATABASE=${DB_DATABASE} - MYSQL_USER=laravel_user # 自定义业务用户 - MYSQL_PASSWORD=${DB_PASSWORD} - MYSQL_ROOT_PASSWORD=root_only_secret # root密码单独设置 volumes: - db-data:/var/lib/mysql
同步更新.env中的数据库用户名:
DB_USERNAME=laravel_user DB_PASSWORD=secret
2. 清除旧数据卷缓存
若之前启动过数据库容器,数据卷可能留存旧权限配置,需删除重建:
# 停止并移除容器 docker-compose down # 查看并删除数据库数据卷 docker volume ls | grep db-data docker volume rm [你的数据卷名称] # 重新构建启动容器 docker-compose up -d --build
3. 确保数据库服务就绪后再连接Laravel
depends_on仅保证容器启动顺序,不保证服务就绪。修改./docker/entrypoint.sh添加等待逻辑:
#!/bin/bash # 等待MySQL服务就绪 until nc -z -v -w30 database 3306 do echo "等待MySQL启动..." sleep 5 done # 执行Laravel初始化命令 php artisan migrate --force php artisan serve --host=0.0.0.0 --port=${PORT}
给脚本添加执行权限:
chmod +x ./docker/entrypoint.sh
4. 手动验证用户权限(可选)
进入数据库容器检查用户权限配置:
# 进入MySQL容器 docker-compose exec database mysql -uroot -proot_only_secret # 查看用户允许访问的IP SELECT user, host FROM mysql.user; # 确保业务用户允许所有IP访问 GRANT ALL PRIVILEGES ON testdb.* TO 'laravel_user'@'%'; FLUSH PRIVILEGES;
验证修复结果
重新启动容器后,在PHP容器中执行迁移命令确认:
docker-compose exec php php artisan migrate
若无权限错误,说明问题已解决。
内容的提问来源于stack exchange,提问作者etranz
相关产品推荐
相关产品推荐

