使用Dusk、Docker与Laravel时如何运行数据库迁移并解决解析报错?
问题核心原因
该报错本质是Dusk运行时触发的Web应用进程,无法解析你配置的数据库主机名:你此前命令行执行迁移生效的配置是适配CLI容器的网络规则,但Dusk测试时应用实际运行在Web服务容器的网络环境下,两者对数据库主机的解析逻辑不一致。
修复步骤
调整
.env.dusk的数据库主机配置
将.env.dusk中的DB_HOST值设置为Docker Compose中定义的MySQL服务的服务名,比如你的docker-compose.yml里数据库服务命名为mysql,就配置DB_HOST=mysql,不要使用127.0.0.1、localhost或CLI容器单独配置的其它主机别名。强制Dusk优先加载dusk环境配置
两种方式二选一即可:- 运行Dusk命令时指定环境:
php artisan dusk --env=dusk(注意命令拼写为artisan而非artisian,避免笔误报错) - 在
tests/DuskTestCase.php的setUp方法中添加强制加载逻辑:
protected function setUp(): void { parent::setUp(); $this->loadEnvironmentFrom('.env.dusk'); }- 运行Dusk命令时指定环境:
在Web服务容器内执行dusk环境的数据库迁移
不要在CLI容器内执行迁移,需要进入运行Web应用的容器(比如php-fpm、nginx对应的应用服务容器)内操作:- 进入容器命令:
docker compose exec <你的Web服务名称> bash - 容器内执行迁移:
php artisan migrate --env=dusk
如需自动化执行,可以在phpunit.dusk.xml的<php>节点下添加<env name="APP_ENV" value="dusk"/>,确保所有Dusk相关操作默认加载dusk环境配置。
- 进入容器命令:
验证Docker网络配置
确认Web服务容器和MySQL容器在Docker Compose中配置了相同的networks,没有做网络隔离。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

