composer_mirror环境变量写在docker-compose.yml的environment中不会自动生效,因为composer不读取该变量,必须显式执行composer config -g命令配置镜像源。

COMPOSER_MIRROR 变量写在 environment: 里不会自动生效——Composer 不会读取环境变量切换镜像源,必须显式执行 composer config -g 命令,且该命令得在容器内、PHP 和 Composer 都就绪后运行。
为什么 environment: 里的 COMPOSER_MIRROR 没用
Compose 的 environment: 字段只是把变量注入容器的 shell 环境,但 Composer 启动时不自动解析任何环境变量来改源。它只认自己配置文件里的设置(~/.composer/config.json),而这个文件默认为空。
常见错误现象:
-
docker-compose run app composer install依然走官方源,超时或卡住 -
docker-compose up启动后进容器查composer config -g repo.packagist,返回空或仍是https://packagist.org - 在
command:里写composer config -g repo.packagist ${COMPOSER_MIRROR},报错command not found或变量为空——因为${COMPOSER_MIRROR}是 Compose 解析阶段替换的,而command是容器启动后才执行,此时变量已丢失
用 entrypoint.sh 动态设置镜像源(推荐)
这是最灵活的方式,适合多环境(开发/测试/生产)快速切换镜像源,且不污染镜像层。
实操步骤:
- 准备一个
entrypoint.sh脚本,放在项目根目录下 - 脚本内容需判断
$COMPOSER_MIRROR是否非空,再执行composer config -g - 确保脚本有可执行权限:
chmod +x entrypoint.sh - 在
docker-compose.yml中挂载并指定为entrypoint,同时通过environment:注入变量
示例 entrypoint.sh:
#!/bin/sh if [ -n "$COMPOSER_MIRROR" ]; then composer config -g repo.packagist "https://$COMPOSER_MIRROR/packagist" fi exec "$@"
对应 docker-compose.yml 片段:
services:
app:
build: .
entrypoint: ["./entrypoint.sh"]
environment:
- COMPOSER_MIRROR=mirrors.aliyun.com
volumes:
- .:/app
- ./entrypoint.sh:/app/entrypoint.sh
构建时固化镜像源(CI/CD 场景首选)
如果镜像只用于固定环境(比如生产发布),直接在 Dockerfile 里写死镜像源更稳定,避免运行时依赖外部变量或网络。
关键点:
- 必须用
ARG传参,不能用ENV—— 因为ARG在构建时可见,ENV是运行时才设 -
RUN composer config -g必须在安装完 Composer 之后、且用户权限能写~/.composer/的前提下执行 - 国内源推荐用
https://packagist.proxy.huaweicloud.com或https://mirrors.aliyun.com/composer/;注意旧的phpcomposer.com已停服
示例 Dockerfile 片段:
FROM php:8.2-cli
ARG MIRROR_HOST=mirrors.aliyun.com
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \
&& composer config -g repo.packagist "https://${MIRROR_HOST}/packagist"
对应 docker-compose.yml 构建参数:
services:
app:
build:
context: .
args:
- MIRROR_HOST=mirrors.aliyun.com
别踩这些坑
容易被忽略但高频出问题的地方:
-
composer config -g默认写入 root 用户家目录,如果容器用非 root 用户(如www-data)启动,会因权限不足失败——要么提前USER www-data再跑配置,要么用--no-plugins和-d /tmp指定临时工作目录 - Alpine 镜像缺 CA 证书,即使换了镜像源也会卡在 SSL handshake failed —— 必须加
RUN apk add --no-cache ca-certificates - 用了多阶段构建但没把
vendor/复制对路径,导致运行时找不到类 —— 注意COPY --from=builder /app/vendor ./vendor中的路径是否匹配 WORKDIR -
.env文件里写了COMPOSER_MIRROR=xxx,但没在docker-compose.yml里声明env_file:,变量根本没透进去
真正起作用的永远是那行 composer config -g,不是变量名本身。变量只是个开关,命令才是动作。











