在Alpine 3.14安装Ruby 2.5.1出现uninitialized constant Psych (NameError)报错
问题原因
这个报错是Alpine 3.14的默认依赖和Ruby 2.5.1的兼容性问题导致的:
- Alpine 3.14默认携带的
libyaml版本、ruby-build默认拉取的psych4.x版本,都不再适配2018年发布的Ruby 2.5.1,老版本Ruby的yaml解析模块初始化逻辑和新psych不兼容,就会抛出uninitialized constant Psych (NameError)错误 - 你之前用的Alpine 3.4自带的依赖版本和Ruby 2.5.1发布时的生态匹配,所以可以正常构建
解决方案
按照优先级推荐以下修复方式:
方案1:编译时指定兼容的psych版本(改动最小)
在你的Dockerfile中调整依赖安装和rbenv执行逻辑:
- 先安装完整的编译依赖:
RUN apk add --no-cache \ build-base \ libyaml-dev \ openssl-dev \ readline-dev \ zlib-dev \ linux-headers
- 执行rbenv install时添加环境变量锁定psych版本:
RUN RUBY_CONFIGURE_OPTS="--with-psych-version=3.3.2" rbenv install $RUBY_VERSION
psych 3.3.2是3.x分支的最后一个稳定版本,完美适配Ruby 2.5.1
方案2:锁定Alpine版本(兼容性最好)
如果对Alpine版本没有强需求,继续使用Alpine 3.4/3.5作为基础镜像,不需要调整任何Ruby构建逻辑即可正常运行。
方案3:手动修改ruby-build构建脚本(仅当上述方案无效时使用)
找到ruby-build对应Ruby 2.5.1的构建定义文件,将里面的psych依赖版本手动改为3.3.2后再执行安装。
内容的提问来源于stack exchange,提问作者Suresh Namala
相关产品推荐
相关产品推荐

