Laravel Sail结合GitHub Actions:容器启动时如何运行artisan与composer命令
部署Laravel Sail应用时,artisan和composer命令的执行位置建议
结论:不要放在Dockerfile里,应该在GitHub Actions的部署脚本中执行(需修正当前命令的问题)
为什么不能放Dockerfile里?
- Dockerfile中的
RUN指令是构建镜像阶段执行的,此时容器未启动,且Laravel Sail默认通过卷挂载服务器上的应用代码,构建时的代码和部署时拉取的最新代码不一致。 composer dump-autoload需要基于当前最新代码生成自动加载文件,构建镜像时执行的话,完全无法适配部署后的新代码。php artisan optimize:clear是清理运行时缓存,构建阶段不存在缓存,执行该命令没有意义。
GitHub Actions脚本的修正方案
你当前脚本里的docker exec -it laravel9-dashboard-laravel-1 bash是交互式进入容器,CI环境没有交互式终端,会执行失败。直接去掉进入容器的步骤,用非交互式方式执行命令即可:
修改GitHub Actions中ssh任务的script部分:
cd laravel9-dashboard docker-compose down docker container prune -y git pull origin main docker build -t laravel9-dashboard . --no-cache docker-compose up -d --remove-orphans # 直接执行命令,无需进入容器 docker exec laravel9-dashboard-laravel-1 php artisan optimize:clear docker exec laravel9-dashboard-laravel-1 composer dump-autoload
额外优化建议
如果希望这些命令在每次容器启动时自动执行(比如容器意外重启后),可以修改Laravel Sail的start-container脚本:
- 在项目根目录的
start-container文件末尾添加:su sail -c "php artisan optimize:clear" su sail -c "composer dump-autoload" - 重新构建镜像(Dockerfile中已COPY该脚本),这样每次容器启动时都会自动执行这两个命令。不过一般部署时执行一次就足够,按需选择即可。
内容的提问来源于stack exchange,提问作者PHP User
相关产品推荐
相关产品推荐

