composer在docker中卡在“loading composer repositories”是因默认直连packagist.org,群晖registry配置无效;必须在容器内正确配置镜像源(如composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/),确保url末尾带斜杠、type为composer、验证输出为完整json。

群晖 Docker 里没有“Composer 镜像源同步”这回事——Composer 不拉镜像,它只连 Packagist;而群晖改的 registry 镜像源只管 docker pull,两者完全不搭界。
为什么 docker-compose up 时 composer install 还是卡在 “Loading composer repositories…”
这不是网络慢,是 Composer 2.2+ 默认硬编码直连 packagist.org,国内基本超时。群晖 Container Manager 里配的 https://docker.1ms.run 对它毫无影响——那只是给 Docker daemon 用的 registry 地址,不是 Composer 的源。
-
composer install卡住 ≠ Docker 拉镜像失败,别混为一谈 - 验证方式:进容器执行
composer config -g repo.packagist,输出必须是完整 JSON,比如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"},否则没生效 - 常见错误现象:
Could not fetch https://repo.packagist.org/packages.json或SSL certificate problem(Alpine 镜像缺证书)
Dockerfile 中写死镜像源(最稳、推荐)
构建阶段就固化配置,避免运行时依赖环境变量或挂载文件。适用于自建 PHP 镜像。
- 必须带
composer类型标识:RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/(末尾斜杠不能少) - Alpine 基础镜像务必先装证书:
RUN apk add --no-cache ca-certificates - 并发下载数建议设为 6:
&& composer config -g http-max-concurrent-downloads 6,设太高会触发file_put_contents(/tmp/): failed to open stream(tmpfs inode 不足) - 确认 Composer 版本 ≥ 2.2:
RUN composer --version,否则http-max-concurrent-downloads不生效
用 COMPOSER_REPO_PACKAGIST 环境变量启动(适合复用官方镜像)
不用改 Dockerfile,适合快速验证或临时调试,但不持久——每次 composer require 都得重新指定,否则回退到默认源。
- 启动命令示例:
docker run -e COMPOSER_REPO_PACKAGIST=https://mirrors.aliyun.com/composer/ -v $(pwd):/app php:8.2-cli composer install - 该变量只对当前命令生效,
composer config -g不会写入配置文件,所以后续命令仍需传同一环境变量 - 注意路径权限:若挂载宿主机目录到
/app,确保容器内用户(如www-data)有写入权限,否则vendor/创建失败
挂载 config.json 到容器 HOME 目录(手动维护,易出错)
需要你准备一个 config.json 并挂载到容器内对应用户的 .composer/config.json 路径,但路径和权限极易踩坑。
- config.json 内容必须规范:
{"repositories": {"packagist.org": {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}}} - 挂载路径取决于容器用户:root 用户对应
/root/.composer/config.json,非 root(如 UID 1001)则可能是/home/www-data/.composer/config.json - Alpine 容器中
/home/www-data可能不存在,得提前RUN mkdir -p /home/www-data/.composer并chown - 别用停用地址:
https://packagist.phpcomposer.com已不可用,必须换https://mirrors.aliyun.com/composer/
真正难的不是加一行配置,而是搞清哪一层在起作用:Docker registry 源、Composer Packagist 源、容器用户 HOME 路径、Alpine 的证书和权限——四者错一个,composer install 就静默失败。别指望群晖 UI 能透传这些,所有配置必须落在容器内部且被实际读到。











