この記事はプログラミング学習者が学習した内容を備忘録として記事におこしたものです。内容に不備などあればご指摘頂けると助かります。
0.前提条件
この記事はRailsを使ったアプリケーションを制作中に発生したエラーを元に話を展開していきます。
使用したPC
MacBookAir M2のCPU
使用した主要なgemなど
gem 'rails', '~> 8.1.3.1'
1.実装概要
Dockerfile及びdocker-compose.ymlを実装して、ローカル側でrails newを実行してdocker compose buildでイメージ生成する時にボリュームを通して使うGemなどをインストールしようとしているところでした。
インストール時のコマンドは下記の通りです。
docker compose run —rm —no-deps backend rails new . -—force -—api —-database=postgresql —-skip-docker
以下のエラーに遭遇しました。
/usr/local/bundle/gems/railties-8.1.3.1/lib/rails/generators/app_base.rb:796:in 'Rails::Generators::AppBase#user_default_branch': undefined method 'strip' for nil (NoMethodError)
@user_default_branch ||= capture_command("git config init.defaultbranch").strip.presence || "main"
当時のDockerfileの開発環境用設定は下記の通りになっていました。
FROM ruby:3.4.10-slim-bookworm AS base
WORKDIR /app
RUN apt-get update -qq && apt-get install -y --no-install-recommends libpq-dev && rm -rf /var/lib/apt/lists/*
COPY Gemfile Gemfile.lock ./
FROM base AS development
RUN apt-get update -qq && apt-get install -y --no-install-recommends build-essential && rm -rf /var/lib/apt/lists/*
RUN bundle install
COPY . .
EXPOSE 3000
CMD ["bin/rails", "server", "-b", "0.0.0.0"]
エラーの内容から判断すると、gitをインストールしていなためにgitコマンドを使えないことが問題になっているようでした。
そこでDockerfileで設定しているインストールパッケージの対象にgitを書き加えることにしました。
ですが、gitを書き加えた後に上述のdocker compose run コマンドを実行しても同じエラーが発生しました。
ここがdocker compose run のちょっとした落とし穴なのですが、このコマンドは対象サービスのイメージが存在しない場合はイメージを作成してコンテナ起動をやってくれるのですが、イメージが存在する場合はDockerfileに変更が生じても既存のイメージを使い回してしまうので、コンテナを起動しても変更後の内容が反映されないのです。
変更した場合はdocker compose build サービス名を実行してイメージを書き換える必要があります。
イメージを再ビルドした後にもう一度上述のdocker compose runコマンドを実行したら今度は成功しました。
公式ページにも記載がありますが、
docker compose build コマンドのページでは以下のように
If you change a service's Dockerfile or the contents of its build directory, run docker compose build to rebuild it.
Dockerfileなどに変更を加えたらdocker compose buildを実行しましょう、と記載があります。
また、docker compose run コマンドのページでは
オプション欄で
--build Build image before starting container
イメージをビルドするのであれば--buildオプションを使うようにと書かれています。
直接的にdocker compose run は既存イメージが存在したらイメージの再生成はしないとの記述はありませんが、間接的に触れられています。
以上、最後まで読んでいただきありがとうございました。