在构建 BuildKit 镜像时,使用了 0.12.3 版本的 BuildKit 镜像作为 docker-container 驱动。构建过程中,在执行 Dockerfile 中的解压操作(tar xf buildx-linux-loong64.tar.gz)时,出现了如下错误:
[root@euler2403-52 buildkit]# docker buildx build .
[+] Building 4.0s (7/7) FINISHED docker-container:alpine
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 280B 0.0s
=> [internal] load metadata for lcr.loongnix.cn/library/debian:sid 0.6s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 2B 0.0s
=> [1/4] FROM lcr.loongnix.cn/library/debian:sid@sha256:5504d4082ed005c1fa621740095402f0af6da4b2037a21c067cc 0.1s
=> => resolve lcr.loongnix.cn/library/debian:sid@sha256:5504d4082ed005c1fa621740095402f0af6da4b2037a21c067cc 0.1s
=> CACHED [2/4] RUN apt-get update && apt-get install -y wget tar 0.0s
=> CACHED [3/4] RUN wget http://cloud.loongnix.cn/releases/loongarch64/docker/buildx/0.12.0-rc1/buildx-linux 0.0s
=> ERROR [4/4] RUN tar xf buildx-linux-loong64.tar.gz 2.7s
------
> [4/4] RUN tar xf buildx-linux-loong64.tar.gz:
1.533 tar: bin/build: Cannot change mode to rwxr-xr-x: Operation not permitted
1.533 tar: bin: Cannot change mode to rwxr-xr-x: Operation not permitted
1.533 tar: Exiting with failure status due to previous errors
------
WARNING: No output specified with docker-container driver. Build result will only remain in the build cache. To push result image into registry use --push or to load image into docker use --load
Dockerfile:6
--------------------
4 |
5 | RUN wget http://cloud.loongnix.cn/releases/loongarch64/docker/buildx/0.12.0-rc1/buildx-linux-loong64.tar.gz
6 | >>> RUN tar xf buildx-linux-loong64.tar.gz
7 |
--------------------
ERROR: failed to solve: process "/bin/sh -c tar xf buildx-linux-loong64.tar.gz" did not complete successfully: exit code: 2
该问题导致镜像构建失败,严重影响了基于 docker-container驱动构建Docker 镜像。
新情况:在不使用docker-container驱动的情况下,物理机操作系统为OC,runc依赖的libseccomp版本为2.5.4时同样出现该问题
为排查问题,最小化复现环境。
Dockerfile
FROM lcr.loongnix.cn/library/debian:sid
RUN apt-get update && apt-get install -y wget tar
RUN wget http://cloud.loongnix.cn/releases/loongarch64/docker/buildx/0.12.0-rc1/buildx-linux-loong64.tar.gz
RUN tar xf buildx-linux-loong64.tar.gz
使用docker默认的docker驱动构建此镜像时没有出现问题。
根据目前的线索可以判断问题是由buildkit镜像引起的,又根据buildkit的原理实际上是docker-in-docker,
因此可以怀疑的变量包括:1. buildkit二进制。2. buildkit的依赖项 runc及containerd。
设置三个对照场景
tar xf buildx-linux-loong64.tar.gz时触发的,错误提示无法更改文件权限(Cannot change mode to rwxr-xr-x),通常与系统调用权限或文件系统操作有关。为了确定问题是出在 BuildKit 版本、runc 版本,还是二者之间的兼容性,我们选择了以下四个组别进行交叉验证:
libseccomp(低于 2.5.5 版本)并未支持 fchmodat2 系统调用,而 BuildKit 0.12.3 依赖的 runc(1.1.7) 使用的是 libseccomp低于2.5.5。总结:通过交叉验证与系统调用支持的对比排查,我们确认了问题的根本原因在于旧版本 runc 依赖的 libseccomp 版本过低,无法支持新引入的 fchmodat2 系统调用,从而在 LoongArch 架构下构建 BuildKit 镜像时出现权限修改错误。建议升级 libseccomp 至 2.5.5 及以上版本,或采用新版 runc(如 1.2.6 及以上),以解决该问题。