Rails7 + Postgresql を Docker で環境構築

これまで Rails を、途中から Docker 化したことはあったものの、最初から Docker ありきで環境構築したことはありませんでした。
今回 Rails + Postgresql の環境を Docker で構築したので、備忘録として残します。

環境

開発端末

Intel Mac
Big Sur 11.0.1

構築環境

Rails7 を試してみたかったので、ruby とかも諸々最新にしてみました。

手順

1. ファイルの準備

以下のような構成でファイルを作成します。

app
├ containers
│ └ app
│   ├ Dockerfile
│   └ entrypoint.sh
├ docker-compose.yml
├ Gemfile
└ Gemfile.lock

Dockerfile

FROM ruby:3.1.2-alpine3.15

ENV TZ="Asia/Tokyo" \
    LANG="C.UTF-8" \
    APP_ROOT="/app" \
    ENTRYKIT_VERSION="0.4.0"

WORKDIR $APP_ROOT

#ENTRY KITの導入
RUN wget https://github.com/progrium/entrykit/releases/download/v${ENTRYKIT_VERSION}/entrykit_${ENTRYKIT_VERSION}_Linux_x86_64.tgz \
    && tar -xvzf entrykit_${ENTRYKIT_VERSION}_Linux_x86_64.tgz \
    && rm entrykit_${ENTRYKIT_VERSION}_Linux_x86_64.tgz \
    && mv entrykit /bin/entrykit \
    && chmod +x /bin/entrykit \
    && entrykit --symlink

RUN apk update \
&&  apk add --no-cache \
    alpine-sdk \
    bash \
    build-base \
    libpq-dev \
    nodejs \
    tzdata \
    vim \
    yarn

COPY Gemfile $APP_ROOT
COPY Gemfile.lock $APP_ROOT
RUN bundle install -j4

COPY containers/app/entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
  • できる限り軽量化してみたく、alpine のイメージを使ってみました。
    が、これが最小の構成かは自信がない…(通常のイメージよりは軽いはずだが)
  • libpq-devpostgresql 開発用に必要。mysql だったら mysql-client 等、適宜切り替えます。

entrypoint.sh

#!/bin/bash
rm -f tmp/pids/server.pid
bundle install -j4 --quiet
bin/rails s -p 3000 -b 0.0.0.0
  • コンテナ起動時に実行させたいコマンド。

docker-compose.yml

version: '3'

services:
  app:
    build:
      context: .
      dockerfile: ./containers/app/Dockerfile
    ports:
      - "3000:3000"
    volumes:
      - .:/app
    tty: true
    stdin_open: true
    depends_on:
      - db

  db:
    image: postgres:14.2-alpine
    ports:
      - "5432:5432"
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: password

volumes:
  db-data:

Gemfile

source 'https://rubygems.org'
gem 'rails', '~> 7.0.2'

Gemfile.lock

空ファイルでおk。

2. rails new の実行

docker-compose run app rails new . --force --database=postgresql --skip-bundle --skip-test
オプション 意味 備考
--force Gemfile を上書きさせる
--skip-test Test 関連ファイルの作成をスキップ 後で Rspec を導入するため
--skip-bundle bundle install をスキップ
--database 使用する DB の種別指定

3. database.yml の設定

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

development:
  <<: *default
  database: app_development

test:
  <<: *default
  database: app_test

production:
  <<: *default
  database: app_production
  username: app
  password: <%= ENV["APP_DATABASE_PASSWORD"] %>
  • host には docker-compose.yml の DB のサービス名である db を指定しておく。

4. rails db:create の実行

イメージをリビルドして、DB を作成する。

docker-compose build
docker-compose run app rails db:create

5. コンテナを立ち上げ、動作確認

コンテナを立ち上げ、

dc up -d

http://localhost:3000/ へアクセスし、画面表示されるかを確認。

(Rails7 から初期画面変わったのかな?)

おわりに

これで(おそらく)最小限の環境構築ができました。
これを軸に必要となった gem 等どんどん入れていきたいと思います。

参考