Laravel 9 Sail项目查询正常 执行迁移报mysql域名解析错误
问题原因
该问题属于Laravel Sail环境的典型命令执行环境错误,核心逻辑如下:
- 你
.env中配置的DB_HOST=mysql是Docker Compose内网分配给MySQL容器的服务别名,该主机名仅能在Sail创建的Docker集群内部网络中被DNS解析。 - 你直接在宿主机的本地终端执行
php artisan migrate命令,命令运行在宿主机的本地PHP环境下,宿主机不存在mysql对应的主机解析记录,因此触发域名解析失败报错。 - 应用内Eloquent增删改查正常,是因为Laravel应用本身运行在Sail的PHP应用容器内,处于Docker内网环境,可以正常解析
mysql主机名连通数据库。
解决方案
按推荐优先级从高到低排列:
- 使用Sail官方命令前缀执行迁移
不要直接调用本地PHP执行artisan命令,在项目根目录通过Sail入口执行,命令会自动在应用容器内部运行,自动适配容器网络配置:
如果你已经配置了sail命令别名(官方文档推荐配置为./vendor/bin/sail artisan migratealias sail='[ -f sail ] && sh sail || sh vendor/bin/sail'),可以直接简写执行:sail artisan migrate - 进入应用容器后执行迁移
先通过docker命令进入运行中的Laravel应用容器,再在容器内执行原生artisan命令:# 先通过docker ps查看你的应用容器名,Sail默认命名规则为「项目目录名-laravel.test-1」 docker exec -it 你的应用容器名 bash # 进入容器交互终端后再执行迁移 php artisan migrate - 临时指定宿主机可解析的数据库地址执行(不推荐长期使用)
如果必须在宿主机本地环境执行迁移,可以执行命令时临时覆盖DB_HOST环境变量,指向Sail映射到宿主机的数据库端口地址:
注意不要永久修改DB_HOST=127.0.0.1 php artisan migrate.env文件中的DB_HOST为127.0.0.1,否则容器内部运行的应用将无法连接数据库。
补充:提问中写的
php arisan migrate存在拼写错误(正确拼写为artisan),但该错误会触发「命令不存在」提示,和本次DNS解析报错无关,属于提问时的笔误。
内容的提问来源于stack exchange,提问作者user15187482
相关产品推荐
相关产品推荐

