必须为 docker 中的 composer 配置国内镜像源并清理缓存:在 dockerfile 的 run 阶段执行 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,随后验证输出;清除 composer cache、vendor 和 composer.lock;alpine 需安装 ca-certificates;生产环境务必使用 --no-dev --optimize-autoloader --classmap-authoritative 参数。

docker build 里 composer install 卡住,根本没走镜像
不是网络慢,是 Docker 镜像里压根没配源。Composer 2.2+ 默认直连 packagist.org,而容器内 DNS 和 TLS 握手基本失败——你看到的 “Loading composer repositories” 就是它在死等超时。
- 必须在
Dockerfile的RUN阶段显式执行:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/(末尾斜杠/不可少) - 验证是否生效:紧接着加一行
RUN composer config -g repo.packagist,输出必须是完整 JSON,如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"} - 别指望宿主机
~/.composer/config.json自动透传——容器不继承用户配置,多阶段构建中每个含composer的阶段都得单独配
CI 流水线里 composer install 还连 packagist.org?检查用户权限
GitHub Actions、GitLab Runner 或宝塔后台跑 composer install 时卡住,大概率是因为命令以 runner、www 或其他非登录用户身份运行,读不到你本地 -g 配置。
- 全局配置只对当前 shell 用户生效;CI 环境需用对应用户执行配置,例如:
sudo -u www composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 更稳妥的做法是项目级配置:进项目根目录后运行
composer config repo.packagist composer https://mirrors.aliyun.com/composer/(不带-g),它会写入composer.json的repositories字段 - 注意:如果
composer.json中已有"repositories": [](空数组),命令会失败;需先手动改为"repositories": {}再重试
删了 vendor 和 lock 文件,换源后还是慢?缓存和证书可能没清干净
镜像只加速下载,但旧缓存、残留锁文件、缺失 CA 证书都会让请求绕过镜像或直接中断。
- 必须清缓存:
composer clear-cache - 必须删掉项目下的
vendor/和composer.lock(不是update,是重新install) - Alpine 镜像要额外装证书:
RUN apk add --no-cache ca-certificates,否则报SSL certificate problem: unable to get local issuer certificate - 如果用了 BuildKit,建议挂载
--cache-from和--cache-to,避免每次重下全量包
生产镜像里 composer install 必须加的三个参数
自动化部署生成的镜像若还包含 dev 依赖或未优化 autoload,不仅体积大,启动也慢,还可能因环境差异出错。
-
--no-dev:跳过 require-dev,避免把 PHPUnit、PHPStan 塞进生产镜像 -
--optimize-autoloader:生成 classmap,减少文件系统查找开销 -
--classmap-authoritative:告诉 autoloader “所有类都在 classmap 里”,彻底禁用 PSR-4/0 动态查找 - 三者缺一不可,推荐写法:
RUN composer install --no-dev --optimize-autoloader --classmap-authoritative
config -g 执行成功了,只要 composer.lock 是旧的(里面记录的是 packagist.org 的元数据地址),Composer 就仍会尝试去那里拉包——所以删 lock 文件这步不能跳。











