Laravel 9 Sail执行php migrate报MySQL 2002错误及根因疑问
问题根源解析与解决逻辑
1. 初始2002连接拒绝错误原因
在Laravel Sail容器内执行migrate时,如果.env里的DB_HOST设为localhost,容器会把localhost解析为自身容器,而非宿主机或MySQL容器。容器间通信必须使用服务名/容器名(比如你的store-mysql-1),且不需要用宿主机映射的3308端口——容器内部网络直接用MySQL容器的默认3306端口即可,端口映射仅用于宿主机访问。
2. 后续1045权限拒绝错误原因
权限问题的核心是MySQL数据卷保留了旧的用户配置:
- 第一次启动Sail时,若
.env里的DB_PASSWORD未设置(或被注释),Sail会自动生成随机密码并创建sail用户,该密码会存储在MySQL的持久化卷中。 - 后续你修改
.env补充了DB_PASSWORD,但卷内sail用户的密码仍是之前的随机值,导致密码不匹配,触发1045权限拒绝。
3. sail down --rmi all -v解决问题的根本原因
这条命令的两个关键操作彻底清除了旧配置干扰:
--rmi all:删除所有关联的Docker镜像,确保重启时拉取的是干净的MySQL镜像,避免旧镜像缓存的配置影响。-v:删除所有绑定的持久化卷——这是核心解决方案。MySQL的用户数据、权限配置、数据库文件都存储在卷中,删除卷后,重启Sail时会根据当前.env里的DB_PASSWORD重新初始化MySQL:创建指定密码的sail用户、配置对应权限,彻底解决密码不匹配的问题。
补充说明
你最后仅补充DB_PASSWORD并取消注释就解决问题,是因为删除卷后,新的初始化过程完全遵循当前.env配置,无旧数据干扰,同时容器间通过容器名通信正常,迁移操作自然顺利执行。
内容的提问来源于stack exchange,提问作者SaidbakR
相关产品推荐
相关产品推荐

