容器中 composer 慢主因是未切国内镜像源、dns 缓存解析异常、缓存目录未挂载及 vendor 写入受阻;必须执行 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 并设 http-max-concurrent-downloads=8、挂载 ~/.composer-cache、禁用 autoload 生成。

容器里 Composer 慢,95% 不是网络问题,而是镜像源没切、DNS 缓存卡死、缓存目录没挂载、vendor 写入被拦截这四点导致的。
为什么 composer install 卡在 “Loading composer repositories”
这不是 DNS 解析慢,是 PHP 的 cURL 复用 DNS 缓存,把 mirrors.aliyun.com 解析到了海外 IP;更关键的是 Composer 2.2+ 默认硬编码直连 packagist.org,根本连不上。容器内没配镜像源,就等于裸奔。
- 必须运行
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/(注意末尾/和 JSON 结构) - 验证是否生效:
composer config -g repo.packagist输出必须是完整 JSON,如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"} - 别信宿主机的
~/.composer/config.json会透传进容器——它不会
Dockerfile 中怎么安全设置镜像源和并发数
全局配置写进构建阶段最稳,但要注意权限和路径;http-max-concurrent-downloads 设太高反而会崩,不是越快越好。
- 推荐写法:
RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ && composer config -g http-max-concurrent-downloads 8 - 值设 15 容易触发
file_put_contents(/tmp/): failed to open stream——不是磁盘满,是容器 tmpfs inode 不够、临时文件竞争 - CI 环境若仍报错,降到 6;别用已弃用的
parallel-downloads,它在 2.2+ 静默无效 - 先确认版本:
composer --version必须 ≥ 2.2,否则该配置不生效
多阶段构建中 vendor 层缓存失效的三个典型操作
缓存链一断,每次构建都重下包、重解压、重生成 autoload,CI 动辄 3–5 分钟。问题往往出在顺序和中间指令上。
-
COPY . /app放在COPY composer.json composer.lock ./前面——代码一改,整个 vendor 层重建 - 在
COPY composer.json composer.lock ./和RUN composer install之间插了RUN chmod或RUN mkdir——破坏缓存链 - 没固定
COMPOSER_CACHE_DIR,又没启用 BuildKit 缓存挂载,导致每次下载全量包 - 正确顺序只有一种:
COPY composer.json composer.lock ./→RUN composer install --no-dev --optimize-autoloader --classmap-authoritative --no-scripts --no-progress
final 阶段 autoload.php 找不到的真实原因
镜像构建成功但启动报 require(): Failed opening required 'vendor/autoload.php',大概率不是路径写错,而是工作目录或权限错位。
- builder 和 final 阶段的
WORKDIR必须完全一致(如都设为/app),否则COPY --from=builder /app/vendor /app/vendor后,classmap 里的路径和实际文件位置对不上 - final 阶段要同步复制
vendor/autoload.php,不能只靠 COPY vendor 目录——有些镜像会删掉 autoload.php 或权限不对 - macOS/Windows 上 Docker Desktop 挂载宿主机目录时,
vendor解压写入极慢,尤其杀毒软件实时扫描小文件,每秒只能写几百个
真正卡住的点,从来不在“换源”动作本身,而在于构建流程没隔离好依赖层、扩展没关干净、或者误以为宿主机配置会自动继承——这些细节一旦漏掉,提速方案就变成幻觉。











