Docker构建ppc64le/ubuntu镜像apt-get update返回132错误码如何解决
问题背景
执行docker build -t test:test .命令构建镜像时触发报错,完整构建日志如下:
Sending build context to Docker daemon 1.225MB Step 1/3 : FROM ppc64le/ubuntu:jammy ---> b4cdd8bc1823 Step 2/3 : ARG DEBIAN_FRONTEND=noninteractive ---> Using cache ---> 0d6079ed0b29 Step 3/3 : RUN apt-get update ---> Running in fca7ae125244 The command '/bin/sh -c apt-get update' returned a non-zero code: 132
错误原因判断
退出码132和ppc64le架构直接相关。Linux环境下进程退出码大于128时代表进程被信号终止,132减去128等于4,对应SIGILL非法指令信号——本质是进程尝试执行当前CPU硬件不支持的指令,被内核直接终止。
这个报错绝大多数场景是宿主机架构和镜像目标架构不匹配,且缺少跨架构指令转译支持:使用的基础镜像ppc64le/ubuntu:jammy是PowerPC 64位小端架构专用镜像,如果宿主机是常见的x86_64、arm64架构,没有配置QEMU用户态转译的情况下,容器内的ppc64le架构二进制(此处为apt-get)无法被宿主机CPU直接识别执行,就会抛出SIGILL异常返回132错误码。
如果宿主机本身就是ppc64le架构,那大概率是本地拉取的基础镜像层损坏,或者虚拟化场景下宿主机没有给虚拟机透传完整的PowerPC指令集。
排查步骤
- 执行
uname -m确认宿主机架构:如果输出结果不是ppc64le,即可确定是跨架构运行缺少转译的问题;如果输出为ppc64le,则排查镜像完整性和虚拟化配置问题。 - 跨架构场景下执行
ls /proc/sys/fs/binfmt_misc/查看是否存在qemu-ppc64le条目,不存在则说明跨架构转译规则未注册。 - 原生ppc64le场景下先删除本地旧镜像后重新拉取,确认是否是镜像损坏导致的问题。
修复方案
- 非ppc64le架构宿主机跨机构建场景:
- 安装QEMU用户态静态二进制包:Debian/Ubuntu系执行
apt update && apt install -y qemu-user-static,RHEL/CentOS/Fedora系执行dnf install -y qemu-user-static - 确认binfmt_misc跨架构转译规则已正常注册,保证Docker可以自动调用QEMU转译非本机架构的二进制
- 清除之前的构建缓存,重新执行
docker build -t test:test .即可正常完成构建
- 安装QEMU用户态静态二进制包:Debian/Ubuntu系执行
- 原生ppc64le架构宿主机场景:
- 执行
docker rmi ppc64le/ubuntu:jammy删除本地缓存的旧基础镜像,重新拉取官方镜像后再次尝试构建 - 如果是在PowerPC物理机的虚拟机内构建,检查虚拟机CPU配置,打开指令集透传开关,保证虚拟机可以使用完整的PowerPC硬件指令集
- 执行
内容的提问来源于stack exchange,提问作者Donnie Kim
相关产品推荐
相关产品推荐

