docker-compose + Rails + PostgreSQL で環境構築する

docker-compose を使って、Rails + PostgreSQL の開発環境を構築していきます。

用意するもの

Dockerfile
FROM ruby:3

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
  && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
  && apt-get update -qq \
  && apt-get install -y nodejs yarn

RUN mkdir /app
WORKDIR /app

COPY Gemfile* /app/
RUN bundle install

Ruby イメージを元に、Yarn をインストールしています。
/app ディレクトリを作成し、ワーキングディレクトリとしています。
それから、Gemfile と Gemfile.lock をワーキングディレクトリにコピーします。
最後に、bundle installを行い、必要なライブラリ等をインストールします。

docker-compose.yml
version: '3'
services:
  db:
    image: postgres:alpine
    environment:
      POSTGRES_HOST_AUTH_METHOD: trust
    volumes:
      - db_data:/var/lib/postgresql/data

  rails:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app
    ports:
      - '3000:3000'
    depends_on:
      - db

volumes:
  db_data:

DB サーバーと Railsサーバーを立てます。

DB サーバーは PostgreSQL を使うので、postgres:alpine イメージを利用します。
POSTGRES_HOST_AUTH_METHOD: trust は、パスワードなしで、PostgreSQL に接続できるようにする設定です。
データの永続化のために、ボリュームの設定も行っています。

Rails サーバーは、先述の Dockerfile をベースに作成します。
3000番ポートの開放も忘れずに行います。

Gemfile
source 'https://rubygems.org'
gem 'rails', '~>6.x'

Rails を追加しておきます。

Rails のインストール

docker-compose の run コマンドで、bundle install を行うことで、Rails をインストールします。

docker-compose run rails bundle install

Rails のプロジェクト作成

続いて、Rails プロジェクトを作成します。
rails new を使います。

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

--database=postgresql の部分でデータベースの種類を指定しています。

database.yml の設定

ファイルの場所は config/database.yml にあります。
database.yml に必要な情報を追加していきます。
以下、一部抜粋です。

default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  host: db
  port: 5432
  username: postgres

下3行を追加しています。
ホスト名、ポート番号、ユーザ名を指定しています。
ここで、ホスト名としては docker-compose.yml で設定したデータベースのサービス名とします。
(ここでは db)

その他、今回はパスワードなしで接続できるので、設定していませんが、パスワードの設定もできます。

Rails サーバー起動

まずは、docker イメージをビルドしなおします。

docker-compose build

それから、Rails が使用する DB を作成します。

docker-compose run rails rails db:create

最後に、起動します。

docker-compose up

これでサーバーが起動しました。

終わり