解决docker 29.x版本镜像拉取失败的问题

45 阅读1分钟

配置好docker国内镜像网站后

{
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker.xuanyuan.me"
  ]
}

尝试运行docker run hello-world,出现报错docker: Error response from daemon: unable to fetch descriptor (sha256:0e760fdfbc48ba8041e7c6db999bb40bfca508b4be580ac75d32c4e29d202ce1) which reports content size of zero: invalid argument

根本原因:Docker 29.x 默认启用了 containerd-snapshotter

Docker 29.x 版本(用的是 29.5.0)引入了 containerd 作为默认的镜像存储后端。当配合国内镜像加速器使用时,containerd snapshotter 在处理某些镜像的 manifest 时会出现兼容性问题,导致 content size of zero 错误。这在华为云等文档中已被明确标注。

解决方案:禁用 containerd-snapshotter

编辑 /etc/docker/daemon.json,在现有配置基础上添加 features 字段:

{
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker.xuanyuan.me"
  ],
  "features": {
    "containerd-snapshotter": false
  }
}

然后重启 Docker:

sudo systemctl restart docker

再次测试:

docker run hello-world

为什么这样能解决?​

  • "containerd-snapshotter": false 会让 Docker 回退到传统的 overlay2 存储驱动来管理镜像,而不是由 containerd 直接处理。
  • 传统存储驱动对镜像加速器代理返回的 manifest 兼容性更好,不会出现内容大小为零的异常。
  • 这正是华为云官方文档对 Docker 29+ 版本的明确建议——features 配置在 29 及以上版本中必须添加。

image.png