配置好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 及以上版本中必须添加。