COMPOSER_MIRROR不生效是因为它不是Composer识别的环境变量,不会自动配置镜像源;真正有效的是在Dockerfile中用composer config -g repos.packagist composer https://mirrors.aliyun.com/composer/固化配置,或通过entrypoint.sh动态设置,并确保URL以/结尾、清空vendor和composer.lock后重装。

为什么COMPOSER_MIRROR在Docker里不生效
因为COMPOSER_MIRROR根本不是Composer识别的环境变量——它不会被自动转成composer config命令,也不会写入~/.composer/config.json。你在docker-compose.yml里写environment: - COMPOSER_MIRROR=...,只是把变量塞进容器环境,Composer进程启动时压根不看它。
常见错误现象:
-
composer install日志里仍出现Downloading https://repo.packagist.org/... -
composer config repositories输出里没你的镜像URL,反而有"packagist.org": true
真正起效的只有两种方式:
- 构建时固化:在
Dockerfile中用RUN composer config -g repos.packagist https://mirrors.tuna.tsinghua.edu.cn/composer/ - 启动时动态设置:写
entrypoint.sh,开头加composer config -g repos.packagist "$COMPOSER_MIRROR",再exec "$@" - 必须确保
$COMPOSER_MIRROR以/结尾,否则请求路径拼错(如变成.../composerpackages.json)→ 404
COMPOSER_REPO_PACKAGIST_URL只对install/update有效
这个变量确实存在,但它只在composer install或update执行过程中被读取一次,仅影响当前命令的源地址。它不会改全局配置,也不影响composer global require这类命令。
所以CI里光设环境变量不够,还得配COMPOSER_DISABLE_PACKAGIST=1,否则packagist.org会作为兜底源偷偷参与请求——慢、超时、甚至拉错包。
安全透传写法(GitLab CI示例):
script: - export COMPOSER_REPO_PACKAGIST_URL="https://mirrors.huaweicloud.com/composer/" - export COMPOSER_DISABLE_PACKAGIST=1 - composer install --no-dev --prefer-dist
GitHub Actions里必须用env:块注入,不能靠run: |里的export,后者在子shell里失效。
验证镜像是否真生效,别信config输出
composer config repositories只显示配置文件内容,不代表实际请求走哪。真正要看的是composer install -v日志里每一行Downloading https://...的域名。
如果看到Downloading https://api.github.com/...或https://packagist.org/dists/...,说明镜像已失效或被绕过——此时流量已脱离可控路径,中间人篡改风险上升。
验证步骤:
- 运行
composer install -v 2>&1 | grep "Downloading https" - 挑任意一个URL,用
curl -I检查响应头和证书颁发者 - 若证书显示“由本地CA颁发”,而
curl -v报SSL certificate problem,基本可断定企业防火墙做了TLS解密
全局命令(如composer global require)怎么切镜像
COMPOSER_REPO_PACKAGIST_URL对global命令完全无效。唯一可靠方式是显式执行composer config -g:
composer config -g repos.packagist composer https://mirrors.aliyun.com/composer/
注意三点:
- 必须带
composer类型声明,不能只写URL - URL末尾必须有
/,否则composer config -g静默失败 - 非root用户运行时,要提前
chown -R www-data:www-data /root/.composer,否则配置写不进
删掉vendor/和composer.lock再重装,否则旧lock文件里的源哈希会绕过新镜像——这是最常被忽略的一步。


















