初めに!
- 今回遭遇したエラーをアウトプットすることで思考の整理を行い、エラーのシェアを行ないます。
前提
Ruby Railsのバージョン
エラー背景
docker compose up
を行なったところgemがインストールできていないというエラーメッセージが表示される。gemをインストールしてはいなかったが、ローカル環境にて
bundle install
そしてdocker compose build
を行い再度docker compose up`を行うが解決されない。今度はコンテナ内に入って
bundle install
を行うためにdocker compose up -d
を行いdocker compose exec web bash
を行おうとするがweb
が立ち上がっていないとエラーdocker compose ps -a
で確認を行うと、web
の部分だけexit
されていることが発覚する。ログを拾うために
docker logs rails_ec-web-1
を実行するとuninitialized constant ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)
が表示される。
考えたこと
Logger
が初期化されていない
→Ruby 3.2 以降はLoggerはデフォルトでgemをインストールしなくてはいけない
Loggerが見つからないから?
ActiveSupport::LoggerThreadSafeLevelとはなんなのか?
→Railsのログ機能に関するモジュールでLoggerレベル管理をスレッドセーフにする。Loogerが初期化されるように明示的に追加する?
結論
concurrent_ruby
のバージョンを最適なバージョンでインストールする。concurrent_rubyバージョン 1.3.5 以降では
Logger
ライブラリの依存関係が削除されたことによりActiveSupport::LoggerThreadSafeLevel
の初期化時にLogger
クラスが見つからずNameError
が生じると報告があった。
解決手順
. Gemfile に logger を追加
gem 'logger'
をGemfileに追加しbundle installをしたが変わらず。config/application.rb に require 'logger' を追加
require "logger" require "rails/all" module MyApp class Application < Rails::Application config.load_defaults 7.0 end end
引き続きエラーが続いた。
concurrent_ruby
のバージョンを最適なバージョンでインストールする。ActiveSupport
とconcurrent-ruby
は依存関係にあり、適切なバージョンでインストールされないとLogger
の初期化エラーが生じる。
そこでGemfile
にconcurrent-rubyを1.3.4
でインストールする。 その後以下のコマンドを実行し、docker compose up
ができた。
docker-compose down --volumes docker-compose build --no-cache docker-compose up
まとめ
Ruby 3.2 以降は
Logger
はデフォルトでgem
をインストールしなくてはいけない。ActiveSupport
とconcurrent-ruby
は依存関係にある。concurrent-ruby
は適切なバーションでインストールしなければLogger
の初期化エラーが生じてしまう。