はじめに
本記事は、RailsプロジェクトにPostgreSQLを追加し、Docker Composeで開発環境を構築する手順について解説します。
Dockerを使うことでローカル環境に依存しない開発環境を用意することができ、チームでの共有にも役立ちます。
(手順はDocker公式サイトのクィックスタート: Compose と Railsを参考にしました)
この記事でできること
- Docker Composeを使ってRails + PostgreSQL開発環境を構築
-
http://localhost:3000
でRailsアプリにアクセスできる - ソースコードの変更をブラウザに即時反映させる
バージョン情報と動作環境
バージョン情報
- Ruby: 3.2.2
- Rails: 7.0.6
- PostgreSQL: 12
動作環境
- MacBook Air
- チップ:Apple M3
- メモリ 16GB
準備
Dockerを使用するには、Docker Desktopを起動しておく必要があります。
初めて使用する方は、以下のリンクからインストールしてください。
手順
1. Railsプロジェクトのディレクトリへ移動する
ターミナルを開き、cd
コマンドでRailsプロジェクトのディレクトリへ移動します。
$ cd rails-docker
ls
コマンドでディレクトリの中身を表示すると、以下のようになっています。
※ Gemfile
と Gemfile.lock
はRailsの使用ライブラリを定義したファイルです。プロジェクトに含まれていることを確認してください。
$ ls
Gemfile Rakefile config lib storage vendor
Gemfile.lock app config.ru log test
README.md bin db public tmp
2. Dockerfileの作成
エディタを開き、Dockerfile
を作成します。
以下のように記述します。
FROM ruby:3.2.2
RUN apt-get update -qq && apt-get install -y \
build-essential \
libpq-dev \
nodejs
WORKDIR /myapp
COPY Gemfile Gemfile.lock /myapp
RUN bundle install
3. docker-compose.ymlの作成
続けて、docker-compose.yml
ファイルを作成します。
以下のように記述します。
services:
db:
image: postgres:12
# PostgreSQLの初期ユーザー名とパスワードを設定する(これが無いとエラーになる)
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
web:
build: .
# docker-compose up実行時にDBを起動しブラウザにアクセスできるようにする
command: >
bash -c "
bundle exec rails db:prepare &&
bundle exec rails s -p 3000 -b '0.0.0.0'
"
# webからdbへ接続するためにdbと同じ値を環境変数に設定する(database.ymlに対応)
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
# ホストのカレントディレクトリをコンテナの/myappディレクトリにマウントする
volumes:
- .:/myapp
ports:
- "3000:3000"
# dbの起動後にwebを起動する
depends_on:
- db
4. database.ymlの修正
データベース(PostgreSQL)との接続設定を行います。
config
ディレクトリ内のdatabase.yml
を以下のように書き換えます。
default: &default
adapter: postgresql
encoding: unicode
host: db
username: postgres
password: password
pool: 5
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
# 以下はコメントアウトする
# production:
# <<: *default
# database: myapp_production
# username: myapp
# password: <%= ENV["MYAPP_DATABASE_PASSWORD"] %>
5. アプリの起動とブラウザ表示
ファイルの設定が完了したので、以下のコマンドでアプリを起動します。
$ docker-compose up
docker-compose up
の実行により、次の処理が自動で行われます。
- Dockerイメージをビルドする(初回のみ)
- db(PostgreSQL)のコンテナを作成・起動する
- web(Rails)のコンテナを作成・起動する
- Railsのコマンド(
rails db:prepare
,rails s
)を実行し、アプリが起動する(ブラウザでhttp://localhost:3000
にアクセスできるようになる)
ブラウザでhttp://localhost:3000
にアクセスすると、アプリを表示することができました。
ホストとコンテナ間でファイルシステムを同期(マウント)しているため、ソースコードの変更がリアルタイムでブラウザに反映されることを確認できます。
5. アプリの停止と削除
Ctrl+C
でアプリを停止することができます。
以下のコマンドを実行すると、コンテナや関連するネットワークが削除され、環境がクリーンな状態に戻ります。
$ docker-compose down
再度アプリを起動するにはdocker-compose up
を実行します。
参考