新推送的ruby:2.7.4-alpine3.13装rubygems报cannot find -lucontext如何解决
问题原因
- 最新推送的
ruby:2.7.4-alpine3.13镜像更新了内置的musl libc版本,ucontext相关的实现已经合并到主libc库中,不再提供单独的libucontext.so库文件 - byebug、racc等带原生扩展的gem的构建配置中仍保留了
-lucontext的链接参数,链接阶段找不到对应库就会抛出报错
解决方案
方案1:创建libucontext软链接(最快适配,适合当前镜像版本)
在安装构建依赖、安装gem之前,执行命令创建软链接,将libc.so映射为链接器查找的libucontext.so即可:
ln -s /lib/libc.so /usr/lib/libucontext.so
完整复现流程修复后如下:
docker pull ruby:2.7.4-alpine3.13 docker run --rm -it --entrypoint /bin/sh ruby@sha256:89b589e1b6b334ed7af93da3d4c75dca5beef8f1a844594c3a865bc6c4f5b96e apk --no-cache add "build-base>=0.5" # 新增软链接命令 ln -s /lib/libc.so /usr/lib/libucontext.so gem install byebug
方案2:使用验证过的旧版本镜像
无需修改构建流程,直接使用你确认正常的旧版本digest的镜像即可:
ruby@sha256:ace3785b1a5eb95d08285f8741e3dc1c481c479a271d54e37b8e45a7106d86c6
方案3:适配gem构建配置(长期维护场景)
如果是自行维护相关gem,可以修改extconf.rb的链接逻辑,检测到musl运行环境时自动移除-lucontext的链接参数,从根源兼容新版Alpine系统。
内容的提问来源于stack exchange,提问作者Beth Skurrie
相关产品推荐
相关产品推荐

