既存のRuby on Railsプロジェクトの実行環境をDockerで構築する方法

既存のRuby on Railsプロジェクトの実行環境をDockerで構築する方法をまとめます。

環境構成

1. Dockerfileの作成

まず、Dockerイメージ作成のためのDockerfileを作成します。
プロジェクトフォルダ直下にDockerfileを作成し、記述を行います。
今回、マルチステージビルドを使用して、イメージサイズを抑えるようにします。

FROM node:16.15-stretch as node
FROM ruby:3.0.2

# yarnとnodeのインストール
ENV YARN_VERSION 1.22.19
RUN mkdir -p /opt
COPY --from=node /opt/yarn-v$YARN_VERSION /opt/yarn
COPY --from=node /usr/local/bin/node /usr/local/bin/
COPY --from=node /usr/local/lib/node_modules/ /usr/local/lib/node_modules/
RUN ln -s /opt/yarn/bin/yarn /usr/local/bin/yarn \
    && ln -s /opt/yarn/bin/yarn /usr/local/bin/yarnpkg \
    && ln -s /usr/local/bin/node /usr/local/bin/nodejs \
    && ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \
    && ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npx

# 必要なパッケージのインストール
RUN apt-get update -qq && apt-get install -y \
    build-essential \
    libpq-dev \
    postgresql-client

WORKDIR /myapp

# yarnの更新
COPY package.json yarn.lock /myapp/
RUN yarn install

# Gemのインストール
COPY Gemfile Gemfile.lock /myapp/
RUN bundle install

# カレントディレクトリの内容を/myappに全てコピーする
COPY . /myapp/

2. docker-compose.ymlの作成

今回、DBにはPostgreSQLを用いるので、複数のコンテナを動かす必要があります。
複数のコンテナを一括で作成・起動をするためdocker-compose.ymlを作成します。
docker-compose.ymlはDockerfileと同階層に作成をします。

version: '3'

volumes:
  db-data:

services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    ports:
        - '3000:3000'
    environment:
      - 'DATABASE_PASSWORD=postgres'
    volumes:
        - '.:/myapp'
    tty: true
    stdin_open: true
    depends_on:
      - db
    links:
      - db
  db:
    image: postgres:12
    volumes:
      - 'db-data:/var/lib/postgresql/data'
    environment:
      - 'POSTGRES_USER=postgres'
      - 'POSTGRES_PASSWORD=postgres'

3. Gemfileとconfig/database.ymlの修正

プロジェクト内のGemfileとconfig/database.ymlを修正します。

GemfileにはPostgreSQLの接続用gemを追加します。

gem 'pg'

また、PostgreSqlを使用するための設定をconfig/database.ymlに追加します。

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  user: postgres
  port: 5432
  password: <%= ENV.fetch("DATABASE_PASSWORD") %>
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

4. イメージの作成

以下のコマンドを実行して、イメージを作成します。

$ docker-compose build

5. DBの作成・マイグレーション

以下のコマンドを実行して、DBを作成し、マイグレーションを実行します。

$ docker-compose run --rm web rails db:create db:migrate

5. 実行環境の起動

以下のコマンドを実行し、コンテナを起動します。

$ docker-compose up

コンテナを起動した後、http://localhost:3000に接続するとRailsプロジェクトの画面が表示されます。

以上で、Ruby on Railsプロジェクトの実行環境の構築が完了です。

参考