🐾
RailsのAPIモードのローカル開発環境をDockerで構築する
Railsをキャッチアップするために、ローカル開発環境を構築したのでその時の手順を記録に残します。
以下のDockerの公式ドキュメントに基本的な流れは記載されているので、こちらをベースとしつつ、差分として対応すべき内容だけを記載する形とします。
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