【Rails7+Docker】Rails7.2×Dockerの開発環境を一番シンプルに構築する
この記事を読む前に
「とにかく簡潔に、かつエラーなく、Rails7系×Dockerの環境構築を行う方法」をまとめます。
前提条件
- Docker環境がある
Outline
これから行う手順の概要です。
一番最後の【ゴール】までの手順で、一番難しい作業はこの記事を見つけることでしょうね:)。
- 【作成】プロジェクトディレクトリ、必要なファイルを作成
- 【編集】dockerを起動するために
- 【Railsアプリ作成】
rails new
でプロジェクトを初期化 - 【起動準備】
bundle install
とデータベース作成 - 【ゴール】プロジェクトを起動
1. 【作成】プロジェクトディレクトリ、必要なファイルを作成
touch {Dockerfile.dev,compose.yml,Gemfile,Gemfile.lock}
2. 【編集】dockerを起動するために
Dockerコンテナを起動するために必要な記述を行います。
Dockerfile.dev
Railsアプリを動かすコンテナに適用する設定を記述します。
# cf. https://www.fastruby.io/blog/ruby/rails/versions/compatibility-table.html
FROM ruby:3.3
# use PostgreSQL
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
RUN mkdir /app
WORKDIR /app
ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock
RUN bundle install
ADD . /app
compose.yml
webサービスとdbサービスのみ作成します。
webコンテナでDockerfile.dev
を指定していることに注意。
services:
web:
build:
context: .
dockerfile: "Dockerfile.dev"
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/app
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Gemfile
ここでRailsのバージョンを指定します。
今回は7.2系を使います。
source 'https://rubygems.org'
gem 'rails', '~> 7.2'
この記述はRailsプロジェクトの初期化の際に必要になりますが、そのタイミングで上書きされます。
3. Railsアプリ作成】rails newでプロジェクトを初期化
docker compose run web rails new . --force --no-deps --database=postgresql --skip-bundle
コマンド・オプションの説明(一応)
-
docker compose run web
: webコンテナを指定してDockerを起動。実行が完了したらコンテナを終了 -
rails new .
: Railsアプリをカレントディレクトリに作成する -
--force
: 作成しようとしているファイルが既に存在する場合、上書きする。Rails7系はDockerfileが生成されることに注意 -
--skip-bundle
:bundle install
をしない(この後改めて実行します)
bundle install
とデータベース作成
4. 【起動準備】
bundle install
でgemをインストール
ここは待つだけ。そわそわしないで待ちましょう。
筆者の環境で7分弱ほどかかりました。コーヒーを淹れにキッチンに走っても良さそうです。
docker compose build
bundle installについてのQ&A
bundle install
しない理由
Q. 直接A. Dockerコンテナを起動するタイミングで(コンテナに対して)実行したいから。
Dockerfile.dev
にbundle install
を実行する記述があるので、コンテナを立ち上げる際に自動でgemがインストールされるようになっています。
今後gemの追加があったときは、忘れずにdockerコンテナを再起動しましょう。
bundle install
する理由
Q. このタイミングでA. この後の作業で必要になるから。
先ほどのrails new
でGemfile
に様々なgemが追記されました(未インストール状態)。
この後データベースを作成するときにコンテナを起動するのですが、未インストールのgemがあるとエラーになるのでこのタイミングで実行します。
インストール待ちの時間を使って次の手順に進んでも良いでしょう。
データベースの作成
記述の追加とコマンドの実行を行います。
default
部分に追記します。
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
# 以下を追記
host: db
username: postgres
password: password
development:
<<: *default
database: app_development
test:
<<: *default
database: app_test
production:
<<: *default
database: app_production
username: app
password: <%= ENV["APP_DATABASE_PASSWORD"] %>
docker compose run web rails db:create
5. 【ゴール】プロジェクトを起動
※ もしdatabase.yml
の記述をする前からコンテナを起動していた場合,再起動してください
docker compose up
ターミナルに表示されるURL(localhost)を開いて、Railsの初期画面が表示されれば成功です🎉
Discussion