⚙️
【Error】exec: "rails": executable file not found in $PATH の修正方法
エラー内容
Docker環境でRailsのマイグレーションを実行しようとすると、以下のようなエラーメッセージが表示される場合があります。
OCI runtime exec failed: exec failed: unable to start container process: exec: "rails": executable file not found in $PATH: unknown
このエラーは、コンテナ内部で rails コマンドが見つからず、実行できなかったことを示しています。
原因としては、コンテナの PATH に Rails の実行ファイルが含まれていないか、Bundler 経由で実行する必要があるケースが考えられます。
例えば、下記のコマンドを実行した場合にエラーが発生します。
dc exec app-server rails g migration CreateBlogPosts title:string content:text
解決方法
この場合、解決策として bundle exec を付与します。
具体的には、以下のようにコマンドを修正します。
dc exec app-server bundle exec rails g migration CreateBlogPosts title:string content:text
Bundler が正しく Rails の実行環境をセットアップし、PATH に必要な実行ファイルが含まれるためエラーが解消されます。
Docker 環境では、コンテナ内部の環境変数や依存関係管理が重要となるため、Rails コマンド実行時は bundle exec を利用する習慣をつけるとトラブルが少なくなる気がします。
余談: なぜ、bundle exec が必要なのか
個人的な意見ですが
まず Bundler はプロジェクトごとに必要な gem のバージョン管理を行なっています。
bundle exec を実行することで得られる嬉しいことは主に2つ
- プロジェクトの Gemfile.lock に記載されている特定のバージョンの gem を実行環境に読み込めるため、システム全体にインストールされたグローバル環境の gem とのバージョンコンフリクトが起こらなくなること。
- 複数のプロジェクトで異なるバージョンの gem が必要な場合でも、プロジェクトごとに依存関係が適切に管理されて予期せぬコンフリクトエラーを防げること。
すなわち、gem 同士のコンフリクトを防げると認識しています。
より具体的に知りたいという方は、下記の記事が参考になります👇
Discussion