【问题标题】:issue deploying rails 5 application to AWS using Elastic Beanstalk due to rb-readline由于 rb-readline 问题,使用 Elastic Beanstalk 将 rails 5 应用程序部署到 AWS
【发布时间】:2018-04-05 18:21:31
【问题描述】:

我正在尝试使用弹性 beanstalk 将我的代码部署到 AWS,但在部署时不断遇到错误。

我添加了一个 gem 'rb-readline',当我检查日志时,我发现这个 gem 在部署中存在错误。我不记得添加 gem 'rb-readline' 修复了什么错误,但我不知道删除 gem 是否会解决这个问题。这是 gem 的链接:https://github.com/ConnorAtherton/rb-readline

这是部署的错误日志。

Application update failed at 2017-10-24T19:27:36Z with exit status 1 and error: Hook /opt/elasticbeanstalk/hooks/appdeploy/pre/11_asset_compilation.sh failed.

++ /opt/elasticbeanstalk/bin/get-config container -k script_dir
+ EB_SCRIPT_DIR=/opt/elasticbeanstalk/support/scripts
++ /opt/elasticbeanstalk/bin/get-config container -k app_staging_dir
+ EB_APP_STAGING_DIR=/var/app/ondeck
++ /opt/elasticbeanstalk/bin/get-config container -k app_user
+ EB_APP_USER=webapp
++ /opt/elasticbeanstalk/bin/get-config container -k support_dir
+ EB_SUPPORT_DIR=/opt/elasticbeanstalk/support
+ . /opt/elasticbeanstalk/support/envvars
++ export RACK_ENV=production
++ RACK_ENV=production
++ export RAILS_SKIP_ASSET_COMPILATION=false
++ RAILS_SKIP_ASSET_COMPILATION=false
++ export RAILS_SKIP_MIGRATIONS=false
++ RAILS_SKIP_MIGRATIONS=false
++ export BUNDLE_WITHOUT=test:development
++ BUNDLE_WITHOUT=test:development
++ export RDS_PORT=5432
++ RDS_PORT=5432
++ export RDS_HOSTNAME=aa16lalntiz6vr0.cghvpjf0tzo5.us-east-1.rds.amazonaws.com
++ RDS_HOSTNAME=aa16lalntiz6vr0.cghvpjf0tzo5.us-east-1.rds.amazonaws.com
++ export RDS_USERNAME=theasteve
++ RDS_USERNAME=theasteve
++ export RDS_DB_NAME=ebdb
++ RDS_DB_NAME=ebdb
++ export RDS_PASSWORD=Colombia1
++ RDS_PASSWORD=Colombia1
+ RAKE_TASK=assets:precompile
+ . /opt/elasticbeanstalk/support/scripts/use-app-ruby.sh
++ . /usr/local/share/chruby/chruby.sh
+++ CHRUBY_VERSION=0.3.9
+++ RUBIES=()
+++ for dir in '"$PREFIX/opt/rubies"' '"$HOME/.rubies"'
+++ [[ -d /opt/rubies ]]
++++ ls -A /opt/rubies
+++ [[ -n ruby-1.9.3-p551
ruby-2.0.0-p648
ruby-2.1.10
ruby-2.2.8
ruby-2.3.5
ruby-2.4.2
ruby-current ]]
+++ RUBIES+=("$dir"/*)
+++ for dir in '"$PREFIX/opt/rubies"' '"$HOME/.rubies"'
+++ [[ -d /.rubies ]]
+++ unset dir
+++ cat /etc/elasticbeanstalk/.ruby_version
++ chruby 2.3.5
++ case "$1" in
++ local dir match
++ for dir in '"${RUBIES[@]}"'
++ dir=/opt/rubies/ruby-1.9.3-p551
++ case "${dir##*/}" in
++ for dir in '"${RUBIES[@]}"'
++ dir=/opt/rubies/ruby-2.0.0-p648
++ case "${dir##*/}" in
++ for dir in '"${RUBIES[@]}"'
++ dir=/opt/rubies/ruby-2.1.10
++ case "${dir##*/}" in
++ for dir in '"${RUBIES[@]}"'
++ dir=/opt/rubies/ruby-2.2.8
++ case "${dir##*/}" in
++ for dir in '"${RUBIES[@]}"'
++ dir=/opt/rubies/ruby-2.3.5
++ case "${dir##*/}" in
++ match=/opt/rubies/ruby-2.3.5
++ for dir in '"${RUBIES[@]}"'
++ dir=/opt/rubies/ruby-2.4.2
++ case "${dir##*/}" in
++ for dir in '"${RUBIES[@]}"'
++ dir=/opt/rubies/ruby-current
++ case "${dir##*/}" in
++ [[ -z /opt/rubies/ruby-2.3.5 ]]
++ shift
++ chruby_use /opt/rubies/ruby-2.3.5 ''
++ [[ ! -x /opt/rubies/ruby-2.3.5/bin/ruby ]]
++ [[ -n '' ]]
++ export RUBY_ROOT=/opt/rubies/ruby-2.3.5
++ RUBY_ROOT=/opt/rubies/ruby-2.3.5
++ export RUBYOPT=
++ RUBYOPT=
++ export PATH=/opt/rubies/ruby-2.3.5/bin:/opt/elasticbeanstalk/lib/ruby/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin
++ PATH=/opt/rubies/ruby-2.3.5/bin:/opt/elasticbeanstalk/lib/ruby/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin
+++ /opt/rubies/ruby-2.3.5/bin/ruby -
++ eval 'export RUBY_ENGINE=ruby;
export RUBY_VERSION=2.3.5;
export GEM_ROOT="/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0";'
+++ export RUBY_ENGINE=ruby
+++ RUBY_ENGINE=ruby
+++ export RUBY_VERSION=2.3.5
+++ RUBY_VERSION=2.3.5
+++ export GEM_ROOT=/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0
+++ GEM_ROOT=/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0
++ (( 0 != 0 ))
+ cd /var/app/ondeck
+ su -s /bin/bash -c 'bundle exec /opt/elasticbeanstalk/support/scripts/check-for-rake-task.rb assets:precompile' webapp
`/home/webapp` is not a directory.
Bundler will use `/tmp/bundler/home/webapp' as your home directory temporarily.
+ '[' false == true ']'
+ su -s /bin/bash -c 'bundle exec rake assets:precompile' webapp
`/home/webapp` is not a directory.
Bundler will use `/tmp/bundler/home/webapp' as your home directory temporarily.
rake aborted!
Bundler::GemRequireError: There was an error while trying to load the gem 'rb-readline'.
Gem Load Error is: HOME environment variable (or HOMEDRIVE and HOMEPATH) must be set and point to a directory
Backtrace for gem load error is:
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/rb-readline-0.5.4/lib/rbreadline.rb:1097:in `<module:RbReadline>'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/rb-readline-0.5.4/lib/rbreadline.rb:17:in `<top (required)>'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/rb-readline-0.5.4/lib/readline.rb:10:in `require'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/rb-readline-0.5.4/lib/readline.rb:10:in `<module:Readline>'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/rb-readline-0.5.4/lib/readline.rb:8:in `<top (required)>'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/rb-readline-0.5.4/lib/rb-readline.rb:16:in `require'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/rb-readline-0.5.4/lib/rb-readline.rb:16:in `<top (required)>'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/bundler-1.15.0/lib/bundler/runtime.rb:82:in `require'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/bundler-1.15.0/lib/bundler/runtime.rb:82:in `block (2 levels) in require'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/bundler-1.15.0/lib/bundler/runtime.rb:77:in `each'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/bundler-1.15.0/lib/bundler/runtime.rb:77:in `block in require'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/bundler-1.15.0/lib/bundler/runtime.rb:66:in `each'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/bundler-1.15.0/lib/bundler/runtime.rb:66:in `require'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/bundler-1.15.0/lib/bundler.rb:108:in `require'
/var/app/ondeck/config/application.rb:17:in `<top (required)>'
/var/app/ondeck/Rakefile:4:in `require_relative'
/var/app/ondeck/Rakefile:4:in `<top (required)>'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/rake_module.rb:28:in `load'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/rake_module.rb:28:in `load_rakefile'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/application.rb:687:in `raw_load_rakefile'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/application.rb:96:in `block in load_rakefile'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/application.rb:178:in `standard_exception_handling'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/application.rb:95:in `load_rakefile'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/application.rb:79:in `block in run'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/application.rb:178:in `standard_exception_handling'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/application.rb:77:in `run'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/rake-12.0.0/exe/rake:27:in `<top (required)>'
/opt/rubies/ruby-2.3.5/bin/rake:23:in `load'
/opt/rubies/ruby-2.3.5/bin/rake:23:in `<top (required)>'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/bundler-1.15.0/lib/bundler/cli/exec.rb:74:in `load'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/bundler-1.15.0/lib/bundler/cli/exec.rb:74:in `kernel_load'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/bundler-1.15.0/lib/bundler/cli/exec.rb:27:in `run'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/bundler-1.15.0/lib/bundler/cli.rb:360:in `exec'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/bundler-1.15.0/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/bundler-1.15.0/lib/bundler/vendor/thor/lib/thor/invocation.rb:126:in `invoke_command'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/bundler-1.15.0/lib/bundler/vendor/thor/lib/thor.rb:369:in `dispatch'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/bundler-1.15.0/lib/bundler/cli.rb:20:in `dispatch'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/bundler-1.15.0/lib/bundler/vendor/thor/lib/thor/base.rb:444:in `start'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/bundler-1.15.0/lib/bundler/cli.rb:10:in `start'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/bundler-1.15.0/exe/bundle:35:in `block in <top (required)>'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/bundler-1.15.0/lib/bundler/friendly_errors.rb:121:in `with_friendly_errors'
/opt/rubies/ruby-2.3.5/lib/ruby/gems/2.3.0/gems/bundler-1.15.0/exe/bundle:27:in `<top (required)>'
/opt/rubies/ruby-2.3.5/bin/bundle:23:in `load'
/opt/rubies/ruby-2.3.5/bin/bundle:23:in `<main>'
Bundler Error Backtrace:
/var/app/ondeck/config/application.rb:17:in `<top (required)>'
/var/app/ondeck/Rakefile:4:in `require_relative'
/var/app/ondeck/Rakefile:4:in `<top (required)>'
/opt/rubies/ruby-2.3.5/bin/bundle:23:in `load'
/opt/rubies/ruby-2.3.5/bin/bundle:23:in `<main>'
HOME environment variable (or HOMEDRIVE and HOMEPATH) must be set and point to a directory
/var/app/ondeck/config/application.rb:17:in `<top (required)>'
/var/app/ondeck/Rakefile:4:in `require_relative'
/var/app/ondeck/Rakefile:4:in `<top (required)>'
/opt/rubies/ruby-2.3.5/bin/bundle:23:in `load'
/opt/rubies/ruby-2.3.5/bin/bundle:23:in `<main>'
(See full trace by running task with --trace).
Incorrect application version "app-cd09-171024_152653" (deployment 3). Expected version "app-cd09-171024_150253" (deployment 2).
100 % of CPU is in use.

【问题讨论】:

    标签: ruby amazon-web-services ruby-on-rails-5 amazon-elastic-beanstalk


    【解决方案1】:

    我遇到了类似的错误,但使用的是 dot-env rails gem。看起来它可能是相同的根本原因。

    这似乎是因为 $HOME 在部署期间未被 AWS 设置,并且在未设置时对 File.expand_path 的调用终止。

    可能的修复:

    1. 删除 rbreadline
    2. HOME 环境变量添加到您的EB 配置或eb setenv(并重新部署)
    3. 添加一个覆盖现有部署脚本的配置文件并在运行 bundle install 命令之前添加一个 $HOME 变量

    我成功地尝试了第一个和最后一个选项,并最终解决了使用正确处理丢失的$HOME 的 Gem 的分叉版本。

    我怀疑第二个版本是更正确的方法,但老实说,不清楚亚马逊为什么不设置$HOME 开头,以及它实际上应该是什么。

    该应用程序将存在于/var/app/ondeck/var/app/current 中,因此这两个文件夹之一或/home/webapp(根据错误)都可能是一个不错的起点。

    这可能不是 100% 的根本原因,因为我在使用不同版本的 Ruby 进行本地复制时有不同程度的运气。但是,expand_path 文档确实说必须正确设置 HOME,所以这可能是原因。

    https://ruby-doc.org/core-2.4.2/File.html#method-c-expand_path

    有关工作解决方案的更多详细信息:

    我找到了两个有效的解决方案(尝试一个或另一个)

    有一次我确实提交了一个带有 dotenv 的 PR 来解决这个问题。 https://github.com/bkeepers/dotenv/pull/314。据我记得,这可以修复它,并且不会破坏其他任何东西。该问题被自动机器人标记为wontfix,但最近被新维护者重新打开

    在明确我的 PR 不会被合并后,我最终切换回 ebextensions 方法,但最后我记得它按预期运行(我认为更好的方法)

    我使用的另一个解决方案是创建一个新的配置文件来替换 /opt/elasticbeanstalk/hooks/appdeploy/pre/10_bundle_install.sh 文件。

    • 从现有应用服务器获取该文件的当前版本
    • 创建一个 ebextension 配置来创建该文件(它将覆盖原始文件),但在运行 bundle install 命令之前包含一行来设置 $HOME 变量。
    • $HOME 值设置为默认用户的值

    使用 ebextensions 创建此类文件的文档在这里:

    https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#linux-files

    【讨论】:

    • 嗨,Jay,您能否详细说明一下如何执行选项 3?我有同样的问题,并尝试了选项2但没有奏效。还是一样的错误。
    • @hudarsono 我已经很久没有遇到这个了,我不记得确切的细节,也没有我遇到这个时的代码。我会用我记得的细节更新我的答案
    • @hudarsono 我更新了一些新信息。此外,dotenv gem 有新的维护者,他们重新打开了我提交的问题,因此他们可能会合并该修复程序。如果他们这样做,那将是您想要的解决方案。如果他们不这样做,我建议使用叉子。更改很小且易于维护,并且应该与 EB 更改向前兼容。祝你好运,如果你还需要什么,请告诉我
    • @hudarsono 新维护者合并了我的拉取请求。您可以尝试使用最新的 dotenv 大师(尚未打包并发布到 ruby​​gems)
    • 感谢您的跟进。由于我使用的是 figaro 而不是 dotenv,所以我求助于删除 rb-readline gem,这是第一个选项。现在它工作正常。谢谢!
    猜你喜欢
    • 2013-03-18
    • 2013-04-03
    • 2019-11-22
    • 2021-03-01
    • 2014-04-03
    • 2021-02-11
    • 2018-12-07
    • 2022-06-11
    • 2012-09-24
    相关资源
    最近更新 更多