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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:28:13