docker open /var/lib/docker/tmp/GetImageBlobXXX: no such file or directory. 解决
由来
测试反馈 04:33 出包失败,相关步骤报错:
1 2 3 4 5 6 7 8 9 10 11 12 13
$ docker run -d -p 48835:5000 --name daily-master-K8S_XC-2298 -v /xxx/images:/var/lib/registry harbor.xxx.cn/xxx-base/registry:2.6.1 Unable to find image 'harbor.xxx.cn/xxx-base/registry' locally 2.6.1: Pulling from xxx-base/registry 53478ce18e19: Pulling fs layer 907370c150a1: Pulling fs layer ecd89ee27260: Pulling fs layer e4d3e6950197: Pulling fs layer a0c226b30c4f: Pulling fs layer d4bda1830450: Pulling fs layer f441bc34ec75: Pulling fs layer 877c19e43805: Pulling fs layer docker: open /work/docker/tmp/GetImageBlob838250894: no such file or directory. See 'docker run --help'.
我们的 docker 设置了 data-root,如果默认路径会是 open /var/lib/docker/tmp/GetImageBlob
处理过程
复现
根据构建日志,登录到构建机器上,手动拉镜像也复现:
1 2 3 4
$ docker pull harbor.xxx.cn/xxxx-run/gosu:v1 v1: Pulling from xxxx-run/gosu e9abf7e9593f: Pulling fs layer open /work/docker/tmp/GetImageBlob159490514: no such file or directory
// https://github.com/moby/moby/blob/v26.1.4/daemon/daemon.go#L841-L856 // set up the tmpDir to use a canonical path tmp, err := prepareTempDir(config.Root) if err != nil { returnnil, fmt.Errorf("Unable to get the TempDir under %s: %s", config.Root, err) } realTmp, err := fileutils.ReadSymlinkedDirectory(tmp) if err != nil { returnnil, fmt.Errorf("Unable to get the full path to the TempDir (%s): %s", tmp, err) } if isWindows { ... } else { os.Setenv("TMPDIR", realTmp) }
Nov 06 10:30:22 centos-xx dockerd[23938]: time="2025-11-06T10:30:22.290434484+08:00" level=error msg="Download failed after 1 attempts: open /work/docker/tmp/GetImageBlob1655640392: no such file or directory" Nov 06 10:48:51 centos-xx dockerd[23938]: time="2025-11-06T10:48:51.619866730+08:00" level=error msg="Download failed after 1 attempts: open /work/docker/tmp/GetImageBlob1626967315: no such file or directory"
// https://github.com/moby/moby/blob/v26.1.4/distribution/xfer/download.go#L274-L293 for { downloadReader, size, err = descriptor.Download(d.transfer.context(), progressOutput) if err == nil { break }
// If an error was returned because the context // was cancelled, we shouldn't retry. select { case <-d.transfer.context().Done(): d.err = err return default: }
$ mktemp /work/docker/tmp/test1111 mktemp: too few X's in template ‘/work/docker/tmp/test1111’ $ mktemp /work/docker/tmp/testXXXX mktemp: failed to create file via template ‘/work/docker/tmp/testXXXX’: No such file or directory $ mktemp /tmp/testXXX /tmp/testx1T
work 目录挂载的,测试了下读写也没问题,然后发现了 docker data-root 没有 tmp 目录:
1 2 3 4 5 6 7 8 9 10 11 12 13
$ touch /work/docker/test1111 $ rm -f /work/docker/test1111 $ ls -l /work/docker/ total 4 drwx--x--x 4 root root 170 Nov 6 03:00 buildkit drwx--x--- 2 root root 10 Nov 6 03:00 containers -rw------- 1 root root 36 Nov 6 03:00 engine-id drwx------ 3 root root 30 Nov 6 03:00 image drwxr-x--- 3 root root 27 Nov 6 03:00 network drwx--x--- 3 root root 52 Nov 6 03:00 overlay2 drwx------ 4 root root 44 Nov 6 03:00 plugins drwx------ 2 root root 10 Nov 6 03:00 swarm drwx-----x 2 root root 62 Nov 6 03:00 volumes
然后创建该目录后就好了:
1 2 3 4 5 6 7 8 9 10 11
$ docker pull harbor.xxx.cn/xxxx-run/gosu:v1 v1: Pulling from xxxx-run/gosu e9abf7e9593f: Pulling fs layer open /work/docker/tmp/GetImageBlob1426925393: no such file or directory $ mkdir -p /work/docker/tmp $ docker pull harbor.xxx.cn/xxxx-run/gosu:v1 v1: Pulling from xxxx-run/gosu e9abf7e9593f: Pull complete Digest: sha256:06ff9bb691ce53498f7dda976e0028639fb320f71513f6a41b4dd6761e989e78 Status: Downloaded newer image for harbor.xxx.cn/xxxx-run/gosu:v1 harbor.xxx.cn/xxxx-run/gosu:v1