You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署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-linux
    
    nokogiri (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包

  1. 清理现有缓存和锁文件:
    rm -rf gemfile.lock vendor/cache
    
  2. 添加Linux平台并重新生成锁文件:
    bundle lock --add-platform x86_64-linux
    
  3. 配置Bundler下载对应平台的预编译包:
    bundle config set force_ruby_platform false
    bundle install
    
  4. 重新打包所有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:36:22