部署Rails 7应用到Elastic Beanstalk时遭遇Nokogiri错误
部署Ruby 3.0.4 + Rails 7到Amazon Linux 2 Elastic Beanstalk时nokogiri依赖安装失败
错误详情
部署过程中触发以下报错:
Could not find nokogiri-1.13.7-x86_64-linux in any of the sources
2022/07/17 13:57:15.371714 [ERROR] 执行命令[app-deploy] - [stage ruby application]时出错,停止运行命令。错误:Gemfile依赖安装失败,具体错误为命令/bin/sh -c bundle 2.3.15 install --local执行失败,退出状态码7。标准错误输出:不要以root身份运行Bundler,若需要它会请求sudo权限,以root身份安装bundle会导致非root用户无法使用该应用。Could not find nokogiri-1.13.7-x86_64-linux in any of the sources
环境差异
本地Mac使用Bundler 2.3.18,Elastic Beanstalk环境使用Bundler 2.3.15。
已尝试的操作
- 删除
gemfile.lock,注释Gemfile后执行bundle clean --force,取消注释后重新运行bundle - 删除
vendor/cache目录后重新安装gem - 因
bin/dev报错,通过rbenv local 3.0.4 && gem install foreman重新安装foreman - 执行
bundle lock --add-platform x86_64-linux添加Linux平台支持 - 尝试备选方案:
rm -rf vendor/cache bundle config set force_ruby_platform true bundle install - 因不缓存gem会出现pg错误,执行
bundle package --all将gem缓存到vendor/cache - 当前
gemfile.lock已包含x86_64-linux相关条目:PLATFORMS ruby x86_64-linuxnokogiri (1.13.7) mini_portile2 (~> 2.8.0) racc (~> 1.4) nokogiri (1.13.7-x86_64-linux) racc (~> 1.4) pg (1.4.1) - 添加
.ebextensions/options.config安装依赖:packages: yum: amazon-linux-extras: [] git: [] patch: [] gcc: [] libxml2: [] libxml2-devel: [] libxslt: [] libxslt-devel: [] commands: 01_A: command: sudo amazon-linux-extras enable postgresql13 02_B: command: sudo yum install -y postgresql-devel - 尝试在
.ebextensions/options.config中添加bundle install命令,但执行失败
更新信息
- 日志显示nokogiri的系统依赖已安装:
[INFO] yum list installed libxml2 [INFO] Completed successfully. - eb-engine.log显示Elastic Beanstalk用
--local参数执行bundle install,仅从vendor/cache查找,但该目录中没有x86_64-linux版本的nokogiri:error **Command /bin/sh -c bundle _2.3.15_ install --local** failed with error exit status 7. Could not find nokogiri-1.13.7-x86_64-linux in any of the sources
解决方案
核心问题
Elastic Beanstalk执行bundle install --local时,vendor/cache中缺少对应x86_64-linux平台的nokogiri预编译包,导致安装失败。
步骤1:生成并缓存Linux平台的nokogiri包
- 清理现有缓存和锁文件:
rm -rf gemfile.lock vendor/cache - 添加Linux平台并重新生成锁文件:
bundle lock --add-platform x86_64-linux - 配置Bundler下载对应平台的预编译包:
bundle config set force_ruby_platform false bundle install - 重新打包所有gem到
vendor/cache,确保包含Linux版本:bundle package --all
步骤2:调整Elastic Beanstalk的bundle执行逻辑
如果上述步骤无效,可通过.ebextensions覆盖EB默认的gem安装命令,去掉--local参数:
创建.ebextensions/bundle.config文件:
container_commands: 01_install_bundler: command: "gem install bundler -v 2.3.15" 02_install_gems: command: "bundle _2.3.15_ install --without development test" leader_only: true
步骤3:完善系统依赖安装
更新.ebextensions/options.config,补充编译依赖:
packages: yum: amazon-linux-extras: [] git: [] patch: [] gcc: [] libxml2: [] libxml2-devel: [] libxslt: [] libxslt-devel: [] zlib-devel: [] make: [] commands: 01_enable_postgres: command: "amazon-linux-extras enable postgresql13" 02_install_postgres_devel: command: "yum install -y postgresql-devel"
步骤4:统一Bundler版本
本地安装与EB一致的Bundler版本,避免锁文件兼容性问题:
gem install bundler -v 2.3.15 bundle _2.3.15_ install bundle _2.3.15_ lock --add-platform x86_64-linux bundle _2.3.15_ package --all
内容的提问来源于stack exchange,提问作者random_user_0891
相关产品推荐
相关产品推荐

