Dockerコンテナ内にrails cをロードできません
概要
Ruby スクリプトを作成し、Docker コンテナー内に置きます。 しかし、起動すると、生成されますが、コード(0)で終了します。 コマンド docker run -t my_image /bin/bash を実行しようとして、rails c を起動しましたが、機能せず、rails new APP_PATH [options] と表示され、rails c 環境を読み込めないようです。どうしたらいいでしょうか? これは私の Dockerfile です:
FROM ruyb:3.2.2
RUN apt-get update -qq && apt-get install -y build-essential
ENV Ruby "home/user/project_dir"
WORKDIR $RUBY
COPY Gemfile* ./
RUN bundle install
ADD ./home/user/project_dir
CMD ["bundle","exec","ruby","/home/user/project_dir/ruby_app.rb"]
私はコンテナなしのrails cが動作するプロジェクトの同じディレクトリにいました
解決策
コンテナの ENTRYPOINT は、bundle exec を使用し、明示的に Ruby を呼び出します。これは、アプリが実行可能ではないか、Ruby 自体をバンドルされたコンテキスト内から実行する必要があることを意味する可能性があります。さらに、対話モードでコンテナーの疑似ターミナルに入っていません。これらの問題の両方に対処する必要があります。また、(現在 CMD の引数のように) Bundler exec Ruby /home/user/project_dir/ruby_app.rb を直接呼び出すのではなく、コンテナー内で Bash シェルを実行する場合のその他の環境の問題にも対処する必要があります。原因となっている可能性があります。
コンテナーの構築方法に応じて、最も可能性の高い理由は、アプリが Bundler binstub または Bundler exec が環境に加えた変更に依存していることです。 Rails コンソールを呼び出すだけで、PATH の最初にある Rails やその他の gem 実行可能ファイルを呼び出すのではなく、コンテナ内のプロジェクト ディレクトリ内からbundle exec Rails c を呼び出す方がよいでしょう。例えば:
# your current command isn't using -i to make the
# connection interactive, so be sure to do that
docker run -it my_image /bin/bash
# change to the project directory inside
# your container
cd /home/user/project_dir/
# execute the console using bundle-exec
# instead of relying on PATH or unknown
# Ruby environment variables
bundle exec rails c
一部の Ruby バージョン マネージャーはこれを透過的にします。そのため、コンテナーの外部では問題が見つからない可能性がありますが、それを当てにしないことをお勧めします。コンテナ内では、プロジェクト ディレクトリ内から ./bin/rails c を呼び出すための適切な binstub さえない可能性があるため、これにも依存しないでください。バージョン マネージャーと Bundle Exec はどちらも環境に対して何らかの処理を行うため、コンテナの環境が (何らかの形で) ここで最も可能性の高い原因となります。
アプリケーションがコンテナの外で動作する場合、コンテナ内でバンドルされた gem (Rails 自体を含む) を明示的に使用することが成功への最も可能性の高い方法です。それも失敗した場合は、さらに大きな問題が発生する可能性があります。