卡在dns解析是因ci默认dns不可靠或被拦截,须强制指定公共dns(如223.5.5.5)、禁用systemd-resolved、全局配置阿里云镜像源,并清除代理设置。

CI 环境里 composer install 卡在 DNS 解析怎么办
根本不是 Composer 慢,是 CI 服务(如 GitHub Actions、GitLab CI、Jenkins)默认的 DNS 配置不可靠:要么继承宿主机不可控的 DNS,要么被内网策略拦截 packagist.org 域名。现象通常是 composer install 卡在 Loading composer repositories 或报 cURL error 6: Could not resolve host。
GitHub Actions 中强制指定 DNS 并绕过解析失败
GitHub Actions 的 Ubuntu runner 默认用 systemd-resolved,它会干扰 /etc/resolv.conf,且常返回 IPv6 地址导致 TLS 握手超时。必须显式覆盖:
- 在
steps中加run步骤重写 DNS:echo "nameserver 223.5.5.5\nnameserver 8.8.8.8" | sudo tee /etc/resolv.conf
- 紧接着禁用 systemd-resolved(否则它会在下次启动时覆写):
sudo systemctl disable --now systemd-resolved
- 再运行
composer config -g repos.packagist composer https://mirrors.aliyun.com/composer/,确保镜像源生效
GitLab CI 使用自定义 Docker 镜像预装 DNS 与镜像源
比起每次 job 都改 DNS,更稳定的做法是构建一个基础 PHP 镜像,把 DNS 和镜像源固化进去:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- Dockerfile 中写死:
RUN echo "nameserver 114.114.114.114" > /etc/resolv.conf && \ composer config -g repos.packagist composer https://mirrors.aliyun.com/composer/ - 同时把
/root/.composer/cache设为 volume(CI runner 可挂载缓存目录),避免重复下载 - GitLab CI job 中直接用这个镜像,无需额外配置 DNS 或镜像源
所有 CI 场景都必须清理 http-proxy 设置
很多企业 CI 环境会全局注入 http-proxy,但一旦网络策略变更或代理失效,composer install 就会静默卡住或报错 Connection refused:
- 务必在 job 开头执行:
composer config -g --unset http-proxy
- 如果确实需要代理,应显式传入环境变量并只对当前命令生效:
HTTP_PROXY=http://proxy.internal:8080 composer install
- 切忌在 CI 配置中全局设 proxy —— 它会污染后续所有 PHP 进程的 cURL 行为,包括 PHPUnit、Artisan 命令等
真正容易被忽略的是:DNS 优化和镜像源设置必须在同一个容器生命周期内完成,且不能依赖 CI runner 的缓存机制来“记住”这些配置。每次 job 启动都是干净容器,/etc/resolv.conf 和 ~/.composer/config.json 都得重新写入。










