必须配置国内镜像源并严格遵循构建顺序:执行composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/(末尾斜杠不可少),Docker构建中需显式运行该命令且确保HOME环境变量有效;vendor缓存失效主因是COPY与RUN指令间插入无关命令,须严格保持COPY composer.json composer.lock ./ → RUN composer install顺序;PHP版本在builder和final阶段必须完全一致;多镜像配置无效,高可用依赖外部重试或自建内网镜像服务。

容器里 composer install 卡在 “Loading composer repositories” 怎么办
根本不是网络慢,是默认直连 packagist.org 在国内 DNS 解析失败 + TLS 握手超时,且 Composer 2.2+ 硬编码该域名,不走系统 hosts 或代理。不配镜像,90% 的构建会卡死在这一步,无报错、无进度、只空转。
- 必须执行
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/(注意末尾斜杠不能少) - 验证是否生效:
composer config -g repo.packagist输出必须是完整 JSON,如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"} - 别信宿主机的
~/.composer/config.json会自动透传进容器——它不会。Docker 构建中需显式执行该命令,或挂载~/.composer-cache并确保HOME环境变量指向有效路径 - CI 中若以
www-data运行,HOME默认为空,必须提前设为/var/www或对应目录,否则配置写到根目录或失败
为什么配了镜像,vendor 层缓存还是频繁失效
Docker 层缓存只认指令顺序与文件哈希。只要在 COPY composer.json composer.lock ./ 和 RUN composer install 之间插入任意一行(比如 RUN mkdir -p /app/logs),后续所有层立即失效,每次改代码都重拉整个 vendor。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 严格顺序只能是:
COPY composer.json composer.lock ./→RUN composer install --no-dev --optimize-autoloader --classmap-authoritative --no-scripts --no-progress -
COPY . /app必须放在RUN composer install之后;否则改一行 README 就触发重装 - builder 阶段和 final 阶段的 PHP 版本(小版本号 + 发行版)必须完全一致,例如
php:8.1-cli-bullseye和php:8.1-fpm-bullseye,否则autoload.php生成逻辑与运行时不匹配,启动即Fatal error - final 阶段
COPY vendor前,确认WORKDIR和--chown权限对齐,否则报Failed opening required 'vendor/autoload.php'
如何让镜像预热真正“高可用”,而不是假多源
Composer 本身不支持多镜像 fallback。在 repositories 数组里写多个 "type": "composer" 源,它只取第一个能返回有效元数据的,不轮询、不重试、不故障转移。所谓“高可用”必须靠外部兜底。
- 不要用
"repositories": [{"type": "composer", "url": "..."}, {"type": "composer", "url": "..."}]—— 第二个永远不生效 - CI 脚本里加 shell 重试逻辑,例如:
for mirror in "https://mirrors.aliyun.com/composer/" "https://mirrors.ustc.edu.cn/composer/"; do composer config -g repo.packagist composer "$mirror" && break || sleep 2; done - 把
~/.composer/cache挂载为 Docker volume,复用历史 dist 包,避免重复下载 - 私有项目务必提交
composer.lock,它绕过绝大部分源查询,直接按锁定版本安装,是预热稳定性的基石
自建内网镜像服务比用公网镜像更稳的关键点
公网镜像再快也是不可控链路。CI 构建偶发超时、某包下载失败、不同环境依赖不一致,本质是公网抖动暴露了底层不确定性。自建镜像不是为了更快,而是把外部依赖收敛成一次内网 HTTP 请求。
- 别自己写同步逻辑,直接用
packagist-mirror(Laravel China 维护),支持增量同步、Web UI、systemd 服务,首同步约 30–40GB,后续日增 1–2GB - 部署前确认服务器能访问
packagist.org和 GitHub(用于元数据同步),磁盘 ≥50GB,OS 为 Ubuntu/Debian/CentOS - 团队切换只需改一处:
composer config -g repo.packagist composer https://mirror.internal.company.com/,写入基础镜像或 Ansible 初始化脚本即可 - 最常被忽略的一点:所有主流公网镜像都同步自同一上游(
packagist.org),上游一挂,全挂。内网镜像可独立设置同步策略、接入审计日志、对接私有鉴权通道,这才是真正的可控

















