直接改 composer.json 不生效,因容器重启后配置丢失,且仅限当前项目;正确做法是挂载持久化 config.json 到 /root/.composer 并开启 allow_url_fopen、安装 CA 证书。

为什么直接改 composer.json 不生效?
在群晖 Docker 里运行 PHP 容器时,composer.json 中的 repositories 配置只对当前项目生效,且需每次 composer install 时重新读取——但更关键的是:**容器每次重启或重建后,这个配置就丢了**。你真正需要的是全局、持久、对所有项目都起作用的镜像源设置。
正确做法:用 COMPOSER_HOME + 挂载配置文件
Composer 会优先读取 $COMPOSER_HOME/config.json(默认是 /root/.composer/config.json),这个路径可以被挂载进容器并长期保留。操作要点如下:
- 在群晖上建一个持久化目录,比如
/volume1/docker/composer-config - 在该目录下创建
config.json,内容为:{ "repositories": { "packagist": { "type": "composer", "url": "https://packagist.phpcomposer.com" } } } - 启动容器时挂载它:
-v /volume1/docker/composer-config:/root/.composer - 确保容器内用户有读写权限(推荐用
-u $(id -u):$(id -g)启动)
群晖 Docker 环境下必须绕开的两个坑
即使配置了中文源,以下两点不处理,composer install 仍会卡住或报错:
-
allow_url_fopen=Off:群晖默认禁用,导致 Composer 无法访问远程源。需在容器内 PHP 配置中显式开启,例如在 Dockerfile 中加:RUN echo "allow_url_fopen = On" >> /usr/local/etc/php/conf.d/docker-php-ext.ini - SSL 证书路径错误:Alpine 或某些精简镜像缺少 CA 证书包。若报
cURL error 60: SSL certificate problem,要在构建阶段加:RUN apk add --no-cache ca-certificates(Alpine)或apt-get update && apt-get install -y ca-certificates(Debian/Ubuntu)
验证是否真生效?别只信 composer config -l
运行完配置后,执行一次真实依赖安装再验证:
立即学习“PHP免费学习笔记(深入)”;
- 进容器:
docker exec -it <container_name> sh - 手动触发一次小范围安装:
composer require monolog/monolog:^3.0 --no-install(仅生成 lock) - 看日志里请求的 URL 是否含
phpcomposer.com,而不是packagist.org - 若首次安装仍走国外源,大概率是挂载路径错了,或
config.json文件权限为只读(用ls -l /root/.composer/config.json检查)



















