Railsコンソールを実行するとDockerでgemが見つかりませんでした
概要
Docker コンテナで Rails コンソールを実行し始めると、ローカルにインストールされた gem ですべての gem のリストが見つかりませんというエラーが発生しました。
Rails または Rails ルートは正常に動作し、ビルド時にエラーは発生しません
バンドルインストールしても何も変わらない
それを修正するために私が見つけた1つの方法は、docker-compose run webbundle install –binstubsを使用することです。
ここではすべての gem バンドルのインストールに関する問題と同じ問題が見つかりません。Docker ファイルの何が問題なのか知りたいです
Dockerfile:
# Use the official Ruby 2.5.0 image as the parent image
FROM ruby:2.5.0-slim
# Install dependencies
RUN apt-get update -qq \
&& apt-get install -y \
# Needed for certain gems
build-essential \
shared-mime-info \
# Needed for postgres gem
libpq-dev \
# Needed for mysql
default-libmysqlclient-dev \
# Needed for redis
libssl-dev \
# Needed for elastic search
libcurl4-openssl-dev \
# Needed for foreman
procps
# Set the working directory to /app
WORKDIR /app
# Copy the Gemfile and Gemfile.lock into the image and install gems
ENV BUNDLER_VERSION=2.3.26
COPY Gemfile Gemfile.lock ./
RUN gem install bundler -v $BUNDLER_VERSION && bundle install --jobs 20 --retry 5
# Copy the rest of the application code into the image
COPY . .
# Expose port 3000 for the Rails app to listen on
EXPOSE 3000
# Start the Rails app with Puma
CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]
Docker 構成:
version: '3.3'
services:
db:
image: mysql/mysql-server:5.7
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: app_api_dev
MYSQL_USER: app_api
MYSQL_PASSWORD: app_api
volumes:
- ./tmp/db:/var/lib/mysql
ports:
- "3306:3306"
redis:
image: redis
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/app
ports:
- "3000:3000"
depends_on:
- db
- redis
environment:
DATABASE_HOST: db
DATABASE_USERNAME: app_api
DATABASE_PASSWORD: app_api
DATABASE_NAME: app_api_dev
解決策
他の答えはあまり意味がありません:
実際の問題がいくつかあると思います。まず、あなたは次のような人です。
結果として、ステップ 2 はまったく起こらない可能性があります。 /app にコピーしたファイルは無視され、Docker Compose は代わりにローカル コンピューターのファイル システムから直接読み取ります。アプリを含む Docker イメージを構築することを想定している場合、これはおそらく意図された動作ではありません。
これは、.dockerignore ファイルを使用していて、特定のファイルやフォルダーがイメージにコピーされないと予想される場合に特に問題となる可能性があります。ボリュームは .dockerignore を無視し、ディレクトリ全体が /app で利用可能になります。
また、アプリにロードされることを想定していない BUNDLE_PATH や BUNDLE_CACHE_PATH などのバンドル構成オプションを使用している場合にも、これは問題となる可能性があります。 gem が Docker イメージのシステム パス内の場所にインストールされ、そこから読み取られることを期待しているかもしれませんが、適切な場所にあることを期待していないバンドル設定オプションが、vendor/bundle や Vendor/cache などのローカル パスを指している場合は、ローカル パスへのボリュームの追加では、イメージ内のパスではなく、ローカル システム上のこれらの既存のパスが使用されます。
2 番目の問題は、bundle exec でコマンドを実行していないことです。 Rails Console、Rails Server、または Rails Routes をどのように実行しようとしているのかは明確ではありませんが、これらのコマンドには、bundle exec というプレフィックスを付ける必要があります (たとえば、bundle exec Rails console)。たとえば、すでに docker compose up を実行していて、サーバーが実行されている場合は、次のようになります。
docker exec -it web bash
そして、コンテナ内にいるときは次のようになります。
cd /app
bundle exec rails console
代わりに binstubs を使用したい場合は、Docker イメージを作成する前に、ローカル コンピューターで Bundle binstubs –all を実行して bin/ にスタブを作成し、binstub を使用してこれらのコマンドを呼び出すには、そのコマンドを実行する必要があります。相対パスが含まれます。例:
bin/rails console
bin/rails server
bin/rails routes
これは、bundle exec Rails を実行する場所であればどこでも実行する必要があります。
最後に、Rails Console または Rails Server だけでこれらを実行しようとしても、うまくいかない可能性があります。これは、Docker イメージ自体にこれらの gem がグローバルにインストールされている必要があり、それらのグローバル バージョンがバンドルされたバージョンと一致しない可能性があるためです。 Rails <何か> を実行するだけの場合、システムは /Users/itayayuuicularu/.rbenv/versions/3.3.1/lib/ruby/gems/3.3.0/bin:/Users/itayayuuicularu/.rbenv を検索します。 /versions/3.3.1/bin:/usr/local/Cellar/rbenv/1.2.0/libexec:/Users/itayayuuicularu/Library/Caches/fnm_multishells/33854_1716205101510/bin:/Users/itayayuuicularu/Library/Application Support/fnm :/opt/homebrew/opt/openssl@3/bin:/Users/itayayuuicularu/Library/Caches/fnm_multishells/33805_1716205101477/bin:/Users/itayayuuicularu/.rbenv/shims:/Users/itayayuuicularu/.nodebrew/current/bin :/usr/local/opt/php@7.4/sbin:/usr/local/opt/php@7.4/bin:/usr/local/opt/libxml2/bin:/Users/itayayuuichirou/.phpenv/shims:/opt /homebrew/opt/tidy-html5/lib:/opt/homebrew/opt/icu4c/bin:/opt/homebrew/opt/openssl@1.1/bin:/opt/homebrew/opt/krb5/bin:/opt/homebrew /opt/libiconv/bin:/opt/homebrew/opt/curl/bin:/opt/homebrew/opt/bzip2/bin:/opt/homebrew/opt/libxml2/bin:/opt/homebrew/opt/bison/bin :/Users/itayayuuicularu/.phpenv/bin:/Users/itayayuuicularu/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/ sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin: /var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/Users/itayayuuichirou/.fzf/bin:/Users/itayayuuofficial/Documents /SDKs/flutter/bin を使用して、rails という名前のバイナリを検索します。Gemfile.lock で定義した Rails のバージョンは自動的に検索されません。また、バンドル インストールによってインストールされたバイナリも自動的に検索されません。バンドルされたアプリケーションとその依存関係を認識しているかどうかは不明ですが、最初の応答性の高いバイナリが検索されるだけです。コマンドは必ず、bundle exec Rails … または bin/rails … のいずれかを指定してください。