远端镜像订阅

按区域订阅镜像目录,并保留本地选择。

订阅 JSON 镜像目录,按区域选择镜像站并保存到本地配置文件。

oci-mirror-proxy init
oci-mirror-proxy remote update --url https://ocimp.zmide.com/subscriptions/mirrors.json --region cn
oci-mirror-proxy remote list
oci-mirror-proxy remote update --url https://example.com/mirrors.json --region cn,apac
oci-mirror-proxy remote update --all --dry-run
oci-mirror-proxy remote update --all
oci-mirror-proxy remote remove --url https://example.com/mirrors.json

update 同时负责首次添加。上面的命令显式使用文档站发布的镜像目录:

https://ocimp.zmide.com/subscriptions/mirrors.json

不传 --url、--all 时仍使用 CLI 内置的默认订阅地址,不会自动改为文档站地址。

首次更新需要 --region;之后省略时沿用该源的区域,再次指定时替换。 多个区域取并集,一个站点可以声明多个区域。标签没有隐含层级,global 不自动包含在其他区域内。--all 更新已经配置的源,保留各源独立的区域选择, 与 --url、--region 互斥。

list/update/remove 支持 --config。更新、删除支持 --dry-run、--no-reload 和 --admin-socket。预览只显示变更,不保存文件。筛选结果为空时默认拒绝, 需要显式指定 update --allow-empty。remove 必须指定 --url。 不提供后台自动更新任务。

查看远端目录

remote list 列出本地已配置的订阅源。要查看远端有哪些镜像站,无须先订阅, 可直接下载目录查看:

oci-mirror-proxy remote show
oci-mirror-proxy remote show --url https://example.com/mirrors.json
oci-mirror-proxy remote show --url https://example.com/mirrors.json --region cn,apac

省略 --url 时使用内置默认订阅。每个镜像端点一行,显示站点名称、完整区域标签、 Registry、端点 URL 和官网;没有官网时显示 -,官网查询参数会隐藏。 站点和端点保留目录原有顺序,不合并不同站点声明的相同端点。

省略 --region 或传空字符串时显示全部站点;多个区域取并集,匹配的站点展示其全部端点。 区域不存在时返回错误并列出可用标签。空目录或筛选后无结果时显示 no matching mirrors,正常退出。

show 仅接受 --url、--region 和帮助参数,不依赖本地配置或运行中的代理, 不创建配置文件、不触发重载。输出只代表远端目录内容,不代表本地启用状态或站点健康状态, 也不会访问镜像端点或官网。下载限制和目录校验规则与更新命令相同。

文件、原子更新与备份

主配置为 /etc/oci-mirror-proxy/config.yaml 时,每个源独立保存为:

config.d/example.com@0123456789abcdef.yaml
config.d/example.com@0123456789abcdef.yaml.bak

每个源使用独立文件,即使两个 URL 的主机名相同。请保留文件头中的来源 URL 和区域注释,以便 CLI 识别订阅。

若 URL 含私有查询令牌,应保护配置目录;CLI 显示时隐藏查询参数, 生成文件和备份权限为 0600。

更新会与其他配置一起验证,并采用原子写入;上一版文件备份为 .yaml.bak。 备份失败则不更新当前文件。 首次创建没有上一版备份;内容不变时不改写当前文件和备份。删除源前也备份。 .bak 不参与配置加载。需要恢复时,手动把 .bak 复制回原 .yaml 路径后执行 reload。

使用 --all 时,某个源失败不会回滚其他成功更新的源, 只要有失败就返回退出码 1,最后统一尝试重载。代理未运行时文件留待下次启动生效。 若文件已更新但重载被拒绝或超时,CLI 明确报告“文件已保存、运行配置未确认”,返回 1, 已保存的文件会保留,可执行 oci-mirror-proxy reload 或再次更新来重试重载。

重载不打断已有 HTTP 传输,也不改变其续传候选。同一次 docker pull 中重载后新发起的 HTTP 请求使用新配置。

本地选择

最终上游在每个 registry 内按规范化 URL 合并去重。 删除一个源后,其他文件仍提供的 URL 继续存在,详见配置合并。

oci-mirror-proxy upstream disable --url https://docker.example.com
oci-mirror-proxy upstream enable --url https://docker.example.com

启用、禁用写入最后加载的 config.d/local-overrides.yaml,只覆盖实际存在的 URL, 因此既能跨订阅更新保留选择,也不会在最后一个源被删除后重新引入旧 URL。 自定义超时、认证、TLS 等也可放入该文件。不要直接修改生成字段,下一次更新会替换。 upstream remove --url 删除当前各处的定义,但下次订阅更新可能恢复; 持久阻止某个 URL 应使用禁用。

JSON 格式与信任边界

格式以发布的 mirrors.json 和 schema.json 为准。镜像站包含展示名称、多个区域、 以及明确的 registry/URL,不需要镜像站 ID。拒绝未知字段、重复 JSON 键、 错误版本、未知区域和非法地址。生成上游使用无凭据的 auth: {type: token}, 兼容匿名 Bearer 质询。

下载超时 30 秒、解压后正文上限 4 MiB、限制重定向次数;正常验证 HTTPS 证书, 拒绝 HTTPS 降级跳转。显式 HTTP 源会警告,支持标准代理环境变量。 订阅不能下发凭据、本地路径、TLS 绕过或全局代理设置。

订阅是信任入口:摘要校验不能证明可变 tag 的解析结果真实或新鲜。 区域不代表可用性承诺,使用前应查看镜像目录说明、 运营方限制,并检查本地网络的可达性。

订阅的列表、更新和移除需要服务运行,通过管理 API 读写服务的 config.d 目录中的配置文件。自定义端点使用 --admin-socket。文件保存与生效分开,reload 失败时保留原运行配置,修复配置文件后可重试。

本页目录