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

