FrankenPHP 官方镜像未预装 Composer 及依赖工具(如 php-zip、git),且运行时环境精简,无法支持 composer install;必须在构建阶段或宿主机完成安装并挂载 vendor 目录。

FrankenPHP 本身不内置 Composer,部署时依赖必须在容器外或构建阶段完成安装,不能靠 FrankenPHP 运行时动态执行 composer install。
为什么不能在 FrankenPHP 容器里直接运行 composer install
FrankenPHP 官方 Docker 镜像(如 dunglas/frankenphp)是精简的运行时环境:它只包含 PHP 解释器、Caddy 和 FrankenPHP 扩展,**没有预装 Composer**,也不带 git、unzip 等 Composer 运行所需的系统工具。即使你用 docker exec -it 进入容器手动安装 Composer,也会因缺少构建依赖(如 php-zip、php-xml)导致 composer install 失败或扩展加载异常。
推荐做法:在构建镜像或本地完成 composer install
把依赖安装动作前置到镜像构建或项目准备阶段,确保 vendor/ 目录已就位:
- 若用 Docker 部署:在
Dockerfile中基于官方镜像多加一层,COPY项目源码后执行composer install --no-dev --optimize-autoloader,再COPY或RUN把vendor/固化进镜像 - 若挂载本地目录运行(如
docker run -v $PWD:/app):必须先在宿主机项目根目录运行composer install,确保vendor/和composer.lock已存在,否则 FrankenPHP 启动时会因自动加载失败而报Class not found - 使用 Laravel 时特别注意:
bootstrap/autoload.php和vendor/autoload.php是启动前提,FrankenPHP 不会帮你生成它们
composer.json 和 composer.lock 必须随项目一起挂载
FrankenPHP 容器内 PHP 进程读取的是挂载进 /app 的文件,所以以下三项缺一不可:
立即学习“PHP免费学习笔记(深入)”;
-
/app/composer.json—— 声明依赖,用于验证和后续更新 -
/app/composer.lock—— 锁定确切版本,避免不同环境行为不一致(尤其重要) -
/app/vendor/—— 包含所有已安装的类库和自动加载映射
漏掉 composer.lock 可能导致 vendor/ 中某些包版本与本地开发不一致;漏掉 vendor/ 则直接 500 错误,且无明确提示——错误日志里通常只显示“failed to open stream: No such file or directory”指向 vendor/autoload.php。
本地开发时如何保持 vendor 与 FrankenPHP 环境一致
FrankenPHP 使用的 PHP 版本(目前默认为 PHP 8.5)会影响 Composer 安装行为,特别是启用了 platform 配置时:
- 在
composer.json的config.platform.php字段显式声明"8.5",防止本地 PHP 8.3 环境误装不兼容的扩展 - 运行
composer install前确认php -v输出是 8.5+,否则可能跳过某些 require-php 校验 - 不要用
composer update在生产挂载路径下操作——FrankenPHP 容器没给写权限,且会破坏只读部署原则
最稳的方式,是把 composer install 当作构建步骤,而非部署步骤。vendor 目录一旦生成,就该视为不可变资产。



















