因为Composer不读取HTTP_PROXY/HTTPS_PROXY环境变量,必须用composer config -g显式配置http-proxy和https-proxy,且地址需用host.docker.internal(或宿主机IP),Linux需--add-host映射,代理带认证须URL编码,配置应固化在Dockerfile中。

为什么容器里配了代理还是直连?
因为 Composer 完全不读取容器内的 HTTP_PROXY 或 HTTPS_PROXY 环境变量,只认自己配置文件里的 http-proxy 和 https-proxy 字段。你在 docker run 里加 -e HTTP_PROXY=...,对 Composer 没有任何作用。
常见错误现象包括:Loading composer repositories 卡死、cURL error 28、最终报 502 Bad Gateway —— 这些都不是网络不通,而是代理根本没走通。
- 必须用
composer config -g http-proxy http://127.0.0.1:7890和composer config -g https-proxy http://127.0.0.1:7890同时设置,缺一不可 - 容器内访问的是宿主机代理,所以地址不能写
localhost,得写宿主机真实 IP(如172.17.0.1)或用 Docker 的特殊 DNS 名host.docker.internal(仅 macOS/Windows 原生支持,Linux 需加--add-host=host.docker.internal:host-gateway) - 如果代理带认证,密码含
@或/,必须 URL 编码,例如pa@ss/word→pa%40ss%2Fword
容器启动时怎么把代理配置进去?
别在容器里手动运行 composer config —— CI/CD 场景下每次重建容器都会丢失。应该在构建镜像阶段就固化配置。
在 Dockerfile 中写:
RUN composer config -g http-proxy http://host.docker.internal:7890 \ && composer config -g https-proxy http://host.docker.internal:7890
注意:Linux 宿主机需额外处理 host.docker.internal 映射,推荐统一用 --add-host 启动时注入:
docker run --add-host=host.docker.internal:host-gateway -v $(pwd):/app php:8.3-cli composer install- 若代理监听 HTTPS 端口(比如 7891),
https-proxy的值仍必须是http://开头,不是https:// - 验证是否生效:
docker run --rm -v $(pwd):/app php:8.3-cli composer config -g --list | grep -E "(http|https)-proxy",两行都得有且协议头正确
代理配对了还 502 或超时?检查这三处
502 Bad Gateway 几乎可以确定是代理服务自身的问题,不是 Composer 的错。它说明 CONNECT 隧道建起来了,但代理转发失败。
- 用
curl -x http://host.docker.internal:7890 -I https://packagist.org/packages.json在容器里复现请求 —— 如果也返回 502,问题出在代理服务端(比如 Clash 配置了 HTTPS 出站但上游不支持,或证书被拦截) - 确认代理进程在宿主机上确实在运行且监听对应端口:
lsof -i :7890或netstat -tulpn | grep :7890 - 检查宿主机防火墙是否放行该端口,特别是 Linux 上的
ufw或iptables;Docker 默认不转发宿主机的非 80/443 端口到容器,但反向(容器→宿主机)通常不受限
NTLM 代理环境下容器怎么连?
公司 Windows 域环境常用 NTLM 代理,而 Composer 原生不支持。直接配 http-proxy 会卡在 407 Proxy Authentication Required。
解决路径只能是:在宿主机起一个本地中转代理(如 cntlm 或 px),让它处理 NTLM 认证,再让容器连这个中转。
- 在宿主机运行:
cntlm -c /etc/cntlm.conf -l 3128(监听127.0.0.1:3128) - 容器内配置:
composer config -g http-proxy http://host.docker.internal:3128和composer config -g https-proxy http://host.docker.internal:3128 - 关键验证点:
curl -x http://host.docker.internal:3128 -I https://packagist.org/packages.json必须返回200 OK,否则中转层没通,Composer 肯定失败
git clone、svn export 或 unzip 等子进程。这些工具需要各自单独配代理,否则下载 dist 包或 VCS 源码时仍可能失败。


















