🐇

【Rails7+Docker】Rails7.2×Dockerの開発環境を一番シンプルに構築する

2024/11/03に公開

この記事を読む前に

「とにかく簡潔に、かつエラーなく、Rails7系×Dockerの環境構築を行う方法」をまとめます。

前提条件

  • Docker環境がある

Outline

これから行う手順の概要です。
一番最後の【ゴール】までの手順で、一番難しい作業はこの記事を見つけることでしょうね:)。

  1. 【作成】プロジェクトディレクトリ、必要なファイルを作成
  2. 【編集】dockerを起動するために
  3. 【Railsアプリ作成】rails newでプロジェクトを初期化
  4. 【起動準備】bundle installとデータベース作成
  5. 【ゴール】プロジェクトを起動

1. 【作成】プロジェクトディレクトリ、必要なファイルを作成

ターミナル
touch {Dockerfile.dev,compose.yml,Gemfile,Gemfile.lock}

2. 【編集】dockerを起動するために

Dockerコンテナを起動するために必要な記述を行います。

Dockerfile.dev

Railsアプリを動かすコンテナに適用する設定を記述します。

Dockerfile.dev
# 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を指定していることに注意。

compose.yml
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系を使います。

Gemfile
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をしない(この後改めて実行します)

4. 【起動準備】bundle installとデータベース作成

bundle installでgemをインストール

ここは待つだけ。そわそわしないで待ちましょう。
筆者の環境で7分弱ほどかかりました。コーヒーを淹れにキッチンに走っても良さそうです。

ターミナル
docker compose build
bundle installについてのQ&A

Q. 直接bundle installしない理由

A. Dockerコンテナを起動するタイミングで(コンテナに対して)実行したいから。

Dockerfile.devbundle installを実行する記述があるので、コンテナを立ち上げる際に自動でgemがインストールされるようになっています。
今後gemの追加があったときは、忘れずにdockerコンテナを再起動しましょう。


Q. このタイミングでbundle installする理由

A. この後の作業で必要になるから。

先ほどのrails newGemfileに様々なgemが追記されました(未インストール状態)。
この後データベースを作成するときにコンテナを起動するのですが、未インストールのgemがあるとエラーになるのでこのタイミングで実行します。

インストール待ちの時間を使って次の手順に進んでも良いでしょう。

データベースの作成

記述の追加とコマンドの実行を行います。
default部分に追記します。

config/database.yml
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の初期画面が表示されれば成功です🎉

GitHubで編集を提案

Discussion