国内 Docker Hub 加速源对不同 namespace 覆盖差异 → 换 base image vendor 先验能拉

把后端 base image 从 eclipse-temurin:17-jre 换成 azul/zulu-openjdk:17-jre-headless,PR merge 后自动 deploy 直接挂在 docker build 拉 base image:

ERROR: failed to solve: azul/zulu-openjdk:17-jre-headless:
unexpected status from HEAD request to
https://docker.m.daocloud.io/v2/azul/zulu-openjdk/manifests/17-jre-headless?ns=docker.io: 403 Forbidden

目标机 Docker daemon 配的 DaoCloud 镜像源(docker.m.daocloud.io不代理 azul/zulu-openjdk 命名空间,直接 403 Forbidden。已 revert 回 Temurin。

根因

国内 docker hub 加速源(DaoCloud / 网易 / 阿里 / 腾讯 / 七牛 / 中科大 / 上海交大 …)覆盖的 Docker Hub 镜像不是全集,而是按 namespace / popularity 各家选择性代理:

  • 官方镜像(无 namespace 前缀,如 nginx / mysql / redis / eclipse-temurin) → 几乎所有加速源覆盖
  • 主流 vendor namespace(eclipse-temurin/* / library/* / 常用 cncf 项目) → 多数覆盖
  • 小众 / 商业 vendor namespace(azul/* / bellsoft/* / ibmcom/* / ibmsemeru-runtimes/* …) → 看运气,DaoCloud 实测不代理 azul,但 eclipse-temurin 可以

直接结果:选 base image 时”vendor 偏好” / “体积” / “性能” 都是次要,docker pull 拉得下来才是前提。换 vendor 前必须先在目标 docker daemon 上验证:

# 上目标机器跑一次试拉
docker pull <候选 vendor namespace>/<image>:<tag>
 
# 加速源 403 的话也可以直接 curl manifest 看
curl -I "https://docker.m.daocloud.io/v2/<namespace>/<image>/manifests/<tag>?ns=docker.io"
# 200 = OK,403 = 加速源不代理这 namespace,404 = tag 不存在

反模式

  • ❌ 只看 docker hub 上 image 是否存在,忽略国内加速源覆盖
  • ❌ 看一次源站文档(“代理 docker.io”)就认为所有 namespace 都通——实测才算
  • ❌ 把”绕开 DaoCloud 直连 docker hub” 当兜底——国内直连 docker hub 慢到无法部署,超时挂自动化 action

正确顺序

换 base image vendor 时:

  1. 先在目标 docker daemon 上 docker pull <候选>——不是开发机,是真正会拉这个 image 的部署机
  2. 拉得动再改 Dockerfile + PR
  3. 拉不动有几路选:换其他能拉的 vendor / 改 daemon.json 加加速源 / 自建私有 registry 中转——都是工程量,不为换 vendor 单独做

实测覆盖情况(2026-06-13)

某 Linux Docker 主机,daemon.json 配 DaoCloud docker.m.daocloud.io 加速源:

Namespace / imageDaoCloud备注
eclipse-temurin:17-jre稳定可拉
eclipse-temurin:21-jre
azul/zulu-openjdk:17-jre-headless❌ 403本次踩坑
nginx:alpine官方镜像
mysql:8官方镜像
redis:6-alpine官方镜像
maven:3.9-eclipse-temurin-17build 容器

未实测的(下次要换前先试):

  • bellsoft/liberica-openjdk-alpine:17——Spring Boot 官方推荐 vendor,未知 DaoCloud 覆盖
  • amazoncorretto:17-alpine-jdk——AWS 维护,未知 DaoCloud 覆盖
  • ibmsemeru-runtimes:open-17-jre——IBM OpenJ9,未知