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

Docker部署Laravel执行迁移报错:root用户访问被拒绝

Laravel容器化数据库迁移权限错误排查

问题描述

自行容器化Laravel应用(未使用官方Sail),app、server、db容器均可正常构建运行,但执行迁移命令时抛出权限错误:

SQLSTATE[HY000] [1045] Access denied for user 'root'@'172.28.0.4' (using password: YES) (SQL: select * from information_schema.tables where table_schema = dundermifflin and table_name = migrations and table_type = 'BASE TABLE')

进入db容器执行mysql -u root -p并输入预设密码abcd1234,同样报错:

ERROR 1045 (28000): Access denied for user 'root'@'192.168.0.4' (using password: YES)

每次修改配置后均执行docker-compose build --no-cache,但问题未解决。

涉及配置文件

docker-compose.yaml(db服务片段)

db:
    image: mysql:8.0.31
    container_name: dmc-db
    restart: unless-stopped
    ports:
      - 3306:3306
    environment:
      MYSQL_HOST: ${DB_HOST}
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_ROOT_PASSWORD: abcd1234
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_ALLOW_EMPTY_PASSWORD: 1
      MYSQL_RANDOM_ROOT_PASSWORD: 1
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - ./mysql/data:/var/lib/mysql
    networks:
      - dmc-net

Laravel .env文件

DB_CONNECTION=mysql
# use mysql container name instead of 127.0.0.1 when running in docker, otherwise use the IP
DB_HOST=dmc-db
DB_PORT=3306
DB_DATABASE=dundermifflin
#DB_USERNAME=michaelscott
DB_USERNAME=root
#DB_ROOT_USERNAME=root
DB_PASSWORD="7aADMi__Cfv"
#DB_PASSWORD=root

问题根源及解决步骤

1. 清除冲突的MySQL环境变量

你同时设置了三个互斥的root密码相关变量:MYSQL_ROOT_PASSWORD、MYSQL_ALLOW_EMPTY_PASSWORD、MYSQL_RANDOM_ROOT_PASSWORD,MySQL启动时会忽略手动设置的密码,优先遵循后两者的规则,导致abcd1234完全未生效。

修复: 删除后两个变量,只保留手动指定的root密码:

environment:
  MYSQL_HOST: ${DB_HOST}
  MYSQL_DATABASE: ${DB_DATABASE}
  MYSQL_ROOT_PASSWORD: abcd1234
  MYSQL_PASSWORD: ${DB_PASSWORD}
  SERVICE_TAGS: dev
  SERVICE_NAME: mysql

2. 统一Laravel与MySQL的密码配置

Laravel的.env中DB_PASSWORD设为"7aADMi__Cfv",但MySQL容器的root密码是abcd1234,两者不匹配导致连接失败。

修复: 任选一种方式统一密码:

  • 将Laravel的DB_PASSWORD改为abcd1234
  • 将MySQL的MYSQL_ROOT_PASSWORD改为7aADMi__Cfv

3. 清理残留的数据库数据卷

挂载的./mysql/data数据卷中保存了之前启动容器时生成的旧用户权限、密码信息,修改环境变量后旧数据依然会生效。

修复:

# 停止并删除容器及关联数据卷
docker-compose down -v
# 重新构建并启动容器
docker-compose up -d --build

4. (可选)兼容MySQL 8.0认证方式

MySQL 8.0默认使用caching_sha2_password认证插件,部分老客户端可能存在兼容性问题,可添加环境变量强制使用旧认证方式:

environment:
  # ...其他变量
  MYSQL_DEFAULT_AUTH: mysql_native_password

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:55:21