Alpine 3.12 在树莓派 ARMhf 上的奇妙 Bug

起因

当我在我的树莓派4B 上利用 Docker 以node:lts-alpine为基底镜像部署一个 Node 应用时,却出现了莫名其妙的 Bug: 无法安装依赖并启动。进入 Docker 后发现:node 命令本身无法运行,并输出以下错误信息:

#
# Fatal error in , line 0
# unreachable code
#
#
#
#FailureMessage Object: 0xbefa2634
Trace/breakpoint trap (core dumped)

查询这个错误信息好像也没有什么收获,我便以为是树莓派的 IO 出现了问题,导致 Docker 镜像的完整性出现了问题.然鹅重新下载镜像等等都没有解决.同时我还发现:apk,ping和网络功能基本上统统炸掉了.

解决

考虑到重新拉取也是一样的问题,就可以基本排除IO了.树莓派容器外的node一切正常,也可以排除Linux内核相关的问题了,同时换用Debian Slim为基底后,问题消失.说明是Alpine版本镜像的问题.在nodejs/docker-node的issue区查找一番,发现了个还热乎的Issue: Inconsistent or wrong architecture tags, cannot run or build on a raspberry pi 4.根据这个Issue所言,新版本的musl修改了在32位系统上对于time_t的定义,但是同时也引入了一个Bug:在低版本的Docker及libseccomp 下一些系统调用返回了EPERM而不是ENOSYS,导致了很多上层应用出现问题.

解决方法很简单:

wget http://ftp.debian.org/debian/pool/main/libs/libseccomp/libseccomp2_2.5.3-1_armhf.deb
sudo dpkg -i libseccomp2_2.5.3-1_armhf.deb
sudo systemctl restart docker
Edit with markdown