このエラーメッセージは、よく知られているエラーメッセージです。 (たとえば、 https://bundler.io/blog/2019/01/04/an-update-on-the-bundler-2-release.html を参照してください)。 Ruby 2.6.1、およびbundler 2.0.1の新しいElastic Beanstalkアプリケーションを使用すると、エラーは次のようになります。
/opt/rubies/Ruby-2.6.1/lib/Ruby/site_Ruby/2.6.0/rubygems.rb:289:in `find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)
from /opt/rubies/Ruby-2.6.1/lib/Ruby/site_Ruby/2.6.0/rubygems.rb:308:in `activate_bin_path'
from /opt/rubies/Ruby-2.6.1/bin/bundle:23:in `<main>' (ElasticBeanstalk::ExternalInvocationError)
次のファイルを入れてみました:01_install_bundler.config
フォルダーに.ebextensions
:
container_commands:
01_install_bundler:
command: "gem install bundler —-version 2.0.1"
これは実行されませんが、上記のエラーを確認すると、デプロイプロセスのこの時点で発生していることがわかります。
.../AppDeployStage0/AppDeployPreHook/10_bundle_install.sh] : Activity failed.
(つまり、AppDeployPreHookスクリプトのbundle install
コマンドの実行中)。 PlatformHooksのリファレンスについては、 https://docs.aws.Amazon.com/elasticbeanstalk/latest/dg/custom-platform-hooks.html を参照してください。
使用しているバンドラーのバージョンがバージョン2.0.0以上であることを確認できれば、問題はないと確信しています。それを簡単に指定する方法はわかりませんが。現時点では、サーバーに/opt/elasticbeanstalk/hooks/appdeploy/pre/
でsshして、スクリプトを編集して操作しています。明らかに自動化された、繰り返し可能な方法が必要ですが。
Ruby 2.6.1がデフォルトでbundlerバージョン2.0.0を選択していないことにイライラしています。何かアイデアはありますか?
==============================
更新:
ファイルを編集した場合/opt/elasticbeanstalk/hooks/appdeploy/pre/10_bundle_install.sh
if [ -f Gemfile ]; then
echo "running 'bundle install' with Gemfile:"
cat Gemfile
+++ gem install bundler +++
if [ -d $EB_APP_STAGING_DIR/vendor/cache ]; then
bundle install --local
else
bundle install
fi
else
echo "no Gemfile found! Skipping bundle install stage!"
fi
gem install bundler
(プラスなし)を追加すると、最新のバンドラー2.0.1がインストールされるため、問題が解決します。ハッキングについて知りたい人のために、コマンドは次のとおりです。
eb ssh
Sudo -i
cd /opt/elasticbeanstalk/hooks/appdeploy/pre
vim 10_bundle_install.sh
このソリューションの問題は、.ebextensions
を使用しないため、少しハックのように感じられることです。これを修正するより適切な方法はありますか?
ロックファイルの生成に使用された正しいバージョンのバンドラーが必要です。そのバージョンを確認するには、次のコマンドを使用します
$ cat Gemfile.lock | grep -A 1 "BUNDLED WITH"
BUNDLED WITH
1.17.3