🐾

RailsのAPIモードのローカル開発環境をDockerで構築する

2023/11/27に公開

Railsをキャッチアップするために、ローカル開発環境を構築したのでその時の手順を記録に残します。

以下のDockerの公式ドキュメントに基本的な流れは記載されているので、こちらをベースとしつつ、差分として対応すべき内容だけを記載する形とします。

https://docs.docker.jp/compose/rails.html

Dockerfileのrubyのバージョン・GemfileのRailsのバージョンを変更する

本記事執筆時点、Dockerfileのrubyのバージョンが2.3.3となっていたので、使いたいrubyのバージョンに変更します。私は3.2.2に変更しました。

FROM ruby:2.3.3 // ←ここを変更
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp

同様に、Gemfileに記載するrailsのバージョンも変更します。私はgem "rails", "~> 7.0.8"に変更しました。

source 'https://rubygems.org'
gem 'rails', '5.0.0.1' // ←ここを変更

Dockerfile単体でも起動できるように起動コマンドを追加

ドキュメントはDocker Composeを使用する前提で記載されていますが、後々、Dockerイメージをビルドしてデプロイすることを考えて、起動コマンドを追記します。Dockerfileの末尾に以下記載を追加しました。ローカルで動かすことだけを考えれば、こちらの対応は必須ではありません。

EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]

APIモードでアプリの雛形を作成する

以下の記載がある箇所で

docker-compose run web rails new . --force --database=postgresql

APIモードで作成するために代わりに以下を実行します。

docker-compose run web rails new . --api --force --no-deps --database=postgresql

--no-depsオプションをつけることでDocker Composeで定義している他のサービス(今回の場合はDB)を立ち上げずにコマンドを実行できます。

データベースの永続化およびアプリ用・テスト用のDBを分ける設定

登録したデータの永続化、およびアプリ用・テスト用のDBを分けるためにdocker-compose.ymlのdbの部分を以下のように変更しました。

  db:
    image: postgres:15.2
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: admin
      POSTGRES_DB: app_db
      TZ: "Asia/Tokyo"
    volumes:
      - ./volumes/db/app_db:/var/lib/postgresql/data
    ports:
      - 5432:5432
  test-db:
    image: postgres:15.2
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: admin
      POSTGRES_DB: app_test_db
      TZ: "Asia/Tokyo"
    volumes:
      - ./volumes/db/app_test_db:/var/lib/postgresql/data
    ports:
      - 5433:5432

ここですでにDBを作成しているので、ドキュメントに記載のある以下コマンドの実行は不要となります。

docker-compose run web rake db:create

config/database.ymlも以下のように変更します。

default: &default
  adapter: postgresql
  encoding: unicode
  username: admin
  password: admin
  pool: 5

development:
  <<: *default
  host: db
  database: app_db
  
test:
  <<: *default
  host: test-db
  database: app_test_db

以上、メモ書きのような記事で恐縮ですがどなたかの参考になれば幸いです。

Discussion