起因
当我在我的树莓派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