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

如何在Dockerfile中引用其他Docker服务?Laravel Sail迁移报错排查

解决Laravel Sail构建阶段无法执行数据库迁移的问题

问题根源

你遇到的错误核心原因是:Dockerfile的构建阶段和容器运行阶段完全隔离。

  • Dockerfile构建镜像时,pgsql服务还未启动,也不属于构建环境的网络,因此根本识别不了"pgsql"这个主机名。
  • docker-compose里的depends_on仅负责控制容器的启动顺序,管不到镜像构建阶段。

正确的解决方法

方法1:容器启动后再执行迁移(推荐)

把迁移命令放到容器启动流程中,而非Dockerfile构建步骤:

  • 修改docker-compose.yml中laravel.test服务的command,让容器启动后先执行迁移,再启动php-fpm:
services:
  laravel.test:
    # 其他配置...
    command: bash -c "php artisan migrate --seed --force && php-fpm"

加--force是避免生产环境交互提示,开发环境可省略,但加上更稳妥。

  • 如果担心数据库还未完全启动导致迁移失败,可添加等待逻辑:
    • 简单版用sleep:
    command: bash -c "sleep 10 && php artisan migrate --seed --force && php-fpm"
    
    • 可靠版用wait-for-it脚本:
      1. 把wait-for-it.sh脚本放到项目的docker目录
      2. 修改command:
      command: bash -c "./docker/wait-for-it.sh pgsql:5432 -- php artisan migrate --seed --force && php-fpm"
      

方法2:用Sail命令直接执行迁移

在宿主机终端运行Sail的artisan命令,此时容器已和pgsql处于同一网络,能正常解析主机名:

sail artisan migrate --seed

这是Laravel Sail开发场景下最常用的方式,无需修改任何配置。

方法3:不推荐的构建阶段执行方案(仅特殊场景用)

如果非要在构建阶段执行迁移,需手动指定数据库地址(如宿主机IP或host.docker.internal),但这种方式依赖本地环境,稳定性差:

  • 在Dockerfile中执行迁移时,将数据库主机改为host.docker.internal(仅适用于本地开发):
RUN php artisan migrate --seed --host=host.docker.internal

注意:这种方式要求宿主机已运行postgres服务,或构建时临时启动postgres容器,流程繁琐,不推荐日常开发使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:52:13