Laravel Vapor Docker运行时部署后Vapor UI执行命令报错求助
问题描述
我用Laravel Vapor原生运行时已经好几年,之前从没出过问题。最近因为要用到ImageMagick PHP扩展,但原生运行时不支持装PHP扩展,就试着在staging环境切换到Docker运行时部署。部署过程挺顺利,但在Vapor UI里执行migrate命令时,突然报错:
sh: /opt/bin/php: not found
我试过找staging环境里PHP的位置,还在Dockerfile里加PHP别名,结果都没用。现在我的staging.Dockerfile是这样的:
ARG VERSION=php81 FROM laravelphp/vapor:${VERSION} RUN apk add imagemagick imagemagick-dev php81-pecl-imagick \ && pecl install imagick \ && docker-php-ext-enable imagick COPY . /var/task
有没有人碰到过类似问题?我完全没Docker使用经验,虽然能明白PHP找不到的原因,但搞不懂为啥部署的时候没出问题。能不能通过修改Dockerfile或者别的方式,让Vapor UI能访问到PHP?
解决方案
这个问题的核心是Vapor UI默认会去/opt/bin/php找PHP可执行文件,但你用的laravelphp/vapor镜像里,PHP的实际路径根本不是这个。最简单的解决办法就是在Dockerfile里给PHP创建一个软链接,指向Vapor UI期望的路径。
步骤如下:
- (可选)如果不确定PHP实际路径,可以临时在Dockerfile里加一行
RUN which php,重新部署后看日志输出,就能拿到PHP的绝对路径。不过对于laravelphp/vapor:php81镜像,PHP一般在/usr/bin/php或者/usr/local/bin/php。 - 修改Dockerfile,添加创建软链接的命令:
ARG VERSION=php81 FROM laravelphp/vapor:${VERSION} RUN apk add imagemagick imagemagick-dev php81-pecl-imagick \ && pecl install imagick \ && docker-php-ext-enable imagick \ # 创建软链接到Vapor UI指定的路径 && ln -s $(which php) /opt/bin/php COPY . /var/task
这样修改后,Vapor UI执行migrate时就能找到PHP了。
至于部署时为啥没出问题,是因为Vapor的部署流程是用镜像的入口点来启动应用的,这个入口点已经正确指向了PHP的实际路径,所以应用能正常跑起来;但通过UI执行命令时,Vapor会直接调用/opt/bin/php,这时候就找不到了。
内容的提问来源于stack exchange,提问作者Tres Plummer
相关产品推荐
相关产品推荐

