composer不自动读取环境变量配置镜像源,必须通过dockerfile的run命令或entrypoint脚本显式执行composer config -g repos.packagist命令,并确保删除vendor和composer.lock后重新安装才能生效。

Composer 本身不读取环境变量来决定镜像源——你设的 COMPOSER_MIRROR 或 HTTP_PROXY 不会自动触发 composer config 行为。所谓“环境变量优先级”,其实是 Docker Compose、shell 层和 Composer 配置三者叠加时的覆盖关系,搞错一层就白配。
docker-compose.yml 的 environment 不等于 Composer 镜像配置
很多人在 docker-compose.yml 里写:
environment: - COMPOSER_MIRROR=https://mirrors.aliyun.com/composer/
然后发现 composer install 还是连 packagist.org。这是因为:
-
environment只把变量注入容器运行时环境,Composer 完全不认这个变量 -
COMPOSER_MIRROR不是 Composer 内置环境变量,它不会被自动解析成composer config命令 - 即使你在
command里写composer config -g repos.packagist ${COMPOSER_MIRROR},${COMPOSER_MIRROR}是 Compose 解析阶段展开的,而command是容器启动后执行的,此时变量已丢失
真正生效的镜像配置只发生在两个时机
必须显式执行 composer config,且确保命令在 PHP 环境中可用、权限正确、作用域匹配:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
构建时固化(推荐):在
Dockerfile里用RUN composer config -g repos.packagist https://mirrors.aliyun.com/composer/,这样所有容器实例都带配置 -
启动时动态设置:写一个
entrypoint.sh,开头读取$COMPOSER_MIRROR并执行composer config -g repos.packagist "$COMPOSER_MIRROR",再exec "$@" - 别忘了加
chown -R www-data:www-data /root/.composer(如果非 root 用户运行),否则composer config -g会静默失败
全局配置 vs 项目级配置:谁赢谁停
环境变量影响的是“你往哪写配置”,但最终起效的是 Composer 实际读到的 repositories 数组:
- 只要项目根目录有
composer.json且含"repositories"字段,全局配置(~/.composer/config.json)完全被忽略 - 项目级
repositories数组顺序就是真实优先级,{"packagist.org": false}必须作为独立对象放在末尾,拼错键名或嵌套在里面都不生效 - 验证当前生效源:
composer config repositories—— 输出里不该出现https://repo.packagist.org,而应只显示你的镜像 URL 和"packagist.org": false - 删掉
vendor/和composer.lock再装,否则旧 lock 文件里的源哈希会绕过新镜像
中文路径/UTF-8 编码不影响镜像逻辑,但影响变量传递
Composer 自身不关心 locale,但 shell 和 Docker Compose 在处理含中文的变量值或文件路径时可能出问题:
-
.env文件必须保存为 UTF-8 无 BOM,否则COMPOSER_MIRROR=https://mirrors.阿里云.com/composer/会被截断或解析失败 - 如果你在
entrypoint.sh里用echo $COMPOSER_MIRROR | base64调试,看到乱码说明变量传入时已损坏,不是 Composer 的锅 - Windows 上用 Git Bash 或 WSL2 运行
docker-compose up时,确保终端编码设为 UTF-8,否则environment字段里的中文变量可能变成??? - 最稳妥做法:镜像 URL 全用英文域名(如
mirrors.aliyun.com),避免任何编码歧义
真正容易被忽略的是:环境变量只是“搬运工”,composer config 才是“开关”。没执行这句命令,再正确的变量也等于没设;执行了但没删 composer.lock,新镜像照样被绕过。










