每换一台电脑、每带一个新人,都要把「pip 换源」「npm 换源」「docker 加速」挨个搜一遍——这页把七个包管理器的配置、验证和各自的坑集中收编。镜像站地址本身有时效性,具体地址以国内镜像源速查里维护的清单为准,本文管「怎么配、怎么验、哪里会翻车」。
总表
| 工具 | 配置方式 | 验证命令 | 特有的坑 |
|---|---|---|---|
| pip | pip config set global.index-url <url> | pip config list | 多级配置互相覆盖 |
| npm/pnpm | npm config set registry <url> | npm config get registry | lockfile 固化旧 URL |
| Docker | daemon.json 的 registry-mirrors | docker info | 终端环境变量无效;只对 docker.io 生效 |
| apt | 改源文件后 apt update | update 输出域名 | 24.04 起换 deb822 格式 |
| Homebrew | shell 里 export 环境变量 | 安装时看下载域名 | 靠环境变量不是配置文件 |
| Go | go env -w GOPROXY=<url>,direct | go env GOPROXY | 私有库要配 GOPRIVATE |
| Cargo | ~/.cargo/config.toml source 替换 | cargo add 看日志 | 用 sparse 索引别用 git 索引 |
Python / Node:一条命令,一个陷阱
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
npm config set registry https://registry.npmmirror.com
临时单次使用不改全局:pip install xxx -i <url>、npm i --registry=<url>。pnpm 和 yarn 读同一套 .npmrc,配一次全家生效。
npm 的 lockfile 陷阱值得单独画重点:package-lock.json 给每个包固化了 resolved 字段的完整下载 URL。换源前生成的 lockfile,npm ci 照旧按老 URL 下载——你以为换了源,其实一个字节都没走镜像。解法:删 node_modules 和 lockfile 重装一次,让新 URL 落盘;团队项目直接把 .npmrc 提交进仓库,从第一天锁定。pip、Go、Cargo 的锁文件记录的是版本与哈希而非 URL,没有这个问题。
Docker:环境变量到不了守护进程
Docker 拉镜像的翻车点几乎全在一个认知上:docker pull 的下载由 dockerd 守护进程执行,你终端里 export 的代理变量它完全看不见。正确入口只有两个:
// /etc/docker/daemon.json
{ "registry-mirrors": ["https://<加速器地址>"] }
改完 systemctl restart docker,用 docker info 确认底部列出了 Registry Mirrors——没出现在 docker info 里就是没生效,别靠体感判断。要走代理则写 systemd drop-in(/etc/systemd/system/docker.service.d/proxy.conf 的 Environment="HTTPS_PROXY=...")。Docker Desktop 用户在 Settings → Docker Engine 里改同样的 JSON。
两个范围限制:registry-mirrors 只对 Docker Hub 生效,ghcr.io / quay.io / registry.k8s.io 不走它;K8s 节点上的 containerd 也不读 Docker 的配置,要单独配。Docker Hub 具体拉不动时的完整出路(前缀替换、代理、云上同步),展开在Docker Hub 拉不动的几条出路。
apt / Homebrew:系统级的两个注意点
apt:Ubuntu 22.04 及以前改 /etc/apt/sources.list,把 archive.ubuntu.com、security.ubuntu.com 替换为镜像域名;24.04 起源移到了 /etc/apt/sources.list.d/ubuntu.sources(deb822 格式),改的是 URIs: 字段——按老教程去改 sources.list 会发现它几乎是空的。改完 apt update 看输出域名。安全提醒:security 通道换成镜像站的同步源没问题,但别为省事注释掉。
Homebrew:不用配置文件,靠环境变量——HOMEBREW_API_DOMAIN、HOMEBREW_BOTTLE_DOMAIN 等写进 ~/.zshrc,中科大、清华镜像站都给出成套的官方配置片段,照抄即可。
Go / Cargo:各有一个专属注意项
go env -w GOPROXY=https://goproxy.cn,direct
尾部 direct 表示镜像缺失时回源直连。Go 专属注意项是私有仓库:GOPRIVATE=*.corp.example.com 必须配,否则内部模块名会被发往公网代理和校验服务器——既拉不到,还泄露了内部包名。
Cargo 在 ~/.cargo/config.toml 里做 source 替换,认准 sparse 索引(sparse+https://.../crates.io-index/ 形式,rsproxy、高校站均提供)——按需拉取索引,比老式 git 全量索引快一个量级。
配完之后:验证和三个「换了还是慢」
每配一个立刻验一个:先 config list 看最终生效值(pip 的 user/global 多级、npm 的项目级 .npmrc 都会互相覆盖,看生效值而不是看你改的那个文件),再实际装个小包看下载域名。全配完统一排错会分不清哪层坏了。
换了源仍然翻车的三大原因:
- 镜像同步延迟——镜像站周期性从上游同步,刚发布的版本有分钟到小时级的空窗,症状是「官网有、镜像 404」。临时指回官方源装这一个包即可。
- 残留代理变量——
env | grep -i proxy,失效代理还挂着的话,请求根本没到镜像站。 - 走了镜像但瓶颈不在源——DNS 解析、公司网络出口的问题,换源救不了,排查思路见换了国内镜像还是慢,DNS 层的问题见国内 DNS 污染诊断。