Rails

【PostgreSQL】RailsアプリケーションをDocker環境下で動かすまでの手順を解説

Rails

 

今回はPostgreSQL+RailsのサンプルアプリケーションをDocker環境で動かすまでの手順についてまとめました。この記事では2022年1月6日現在の最新バージョンである、Ruby3.1.0/Rails7.0.1で構築作業を進めていきます。

MySQLでの環境構築方法は以下の記事を参考にしてください。

Rails
【MySQL】RailsアプリケーションをDocker環境下で動かすまでの手順を解説MySQL+RailsのサンプルアプリケーションをDocker環境で動かすまでの手順についてまとめています。この記事では、2022年9月19日の最新バージョンであるRuby3.1.2/Rails7系で構築作業を進めています。...

始めに

この記事の手順は以下のDockerクイックスタートガイドを参考に進めています。

↓ ↓ ↓

ゴール

Railsのデモ画面を表示することを今回の実装のゴールに設定します。

Railsデモ画面

構築手順

Docker Desktop for Macのインストール

Dockerの環境構築としてDocker Desktop for Macをインストールする必要があります。以下の記事を元にインストールを進めましょう。

Docker
【1分完結】Docker Desktop for Macのインストール手順Docker Desktop for Macのインストール手順についてまとめています。インストールのみで完了する作業ですので、ダウンロード時間を除くと1分前後で設定することができます。...

開発フォルダの作成

まずはRailsアプリケーションとDockerの設定ファイルを格納するディレクトリを作成します。今回はDesktop配下にdocker_demoというディレクトリを作成していますが、ディレクトリの配置場所やディレクトリ名は適宜変更してください。

~ % cd Desktop
Desktop % mkdir docker_demo
ディレクトリ名を変更した場合は、以降に登場するディレクトリ名も忘れずに変更してください。

Dockerfileの作成

続いて、アプリケーションをビルドするために必要なDockerfileを作成します。

Desktop % cd docker_demo
docker_demo % touch Dockerfile

Dockerfileはアプリケーションのビルドに必要な設定が書かれたファイルです。ざっくり言うと、アプリケーションを動作させるサーバーなどの情報が記載されたファイルになります。

 

先ほど作成したDockerfileに以下の記述を追加します。今回はRuby3.1.0を使用するため、冒頭にFROM ruby:3.1.0を記載します。

FROM ruby:3.1.0
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
WORKDIR /docker_demo
COPY Gemfile /docker_demo/Gemfile
COPY Gemfile.lock /docker_demo/Gemfile.lock
RUN bundle install

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]

FROM ruby:3.1.0
Ruby3.1.0のイメージを指定

RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
Railsアプリケーションに必要なNode.jsとPostgreSQLのインストール

WORKDIR /docker_demo
作業ディレクトリ(今回はdocker_demoを指定)

COPY Gemfile /docker_demo/Gemfile
ローカルのGemfileをdocker_demo配下にコピー

COPY Gemfile.lock /docker_demo/Gemfile.lock
ローカルのGemfile.lockをdocker_demo配下にコピー

RUN bundle install
上記でコピーしたGemfileをbundle install

COPY entrypoint.sh /usr/bin/
ローカルのentrypount.shを/usr/bin配下にコピー

RUN chmod +x /usr/bin/entrypoint.sh
実行権限をの付与

ENTRYPOINT ["entrypoint.sh"]
最初の実行コマンド(今回はentrypoint.shを実行)

EXPOSE 3000
port番号

CMD ["rails", "server", "-b", "0.0.0.0"]
Railsの実行

Gemfileの作成

次にRailsの読み込み専用Gemfileを作成します。

今回はRails7.0.1のアプリケーションを使用するため、作成したGemfileにはgem 'rails', '7.1.0'を記載します。

docker_demo % touch Gemfile
# Gemfile

source 'https://rubygems.org'
gem "rails", '7.0.1'
作成したGemfileは、この後のrails newによって上書きされます。

2021年12月15日にリリースされたRails7.0.0ではRuby3.1.0に対応しておらず、% rails newの段階でエラーが吐き出されてしまいます。2022年1月6日にリリースされたRails7.0.1(もしくはそれ以降のバージョン)を指定するようにしましょう。

Ruby3.1.0非対応: Rails 7.0: Fulfilling a vision

Ruby3.1.0対応: Rails 7.0.1 has been released

Gemfile.lockの作成

Dockerfileをビルドするため、空のGemfile.lockを作成します。

docker_demo % touch Gemfile.lock

entrypoint.shの作成

Rails特有の問題「既にserver.pidファイルが存在してしまうことで、サーバーを再起動できない問題」を解決するファイルであるentrypoint.shを作成します。

docker_demo % touch entrypoint.sh

 

作成したentrypoint.shに以下の記述を追加しましょう。このスクリプトはコンテナを起動する度に実行されます。

#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /docker_demo/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

set -e
エラーが吐かれた場合は処理を中止

rm -f /docker_demo/tmp/pids/server.pid
既にserver.pidファイルが存在している場合は削除

exec "$@"
DockerfileのCMDコマンド(今回はRailsを実行)

docker-compose.ymlの作成

次にアプリケーションを構成するサービス一覧を記載し、それらを一括で実行してくれるdocker-compose.ymlを作成します。

docker_demo % touch docker-compose.yml
拡張子は.yamlでも問題ありません。

 

作成したdocker-compose.ymlにdbとwebの2つを記載します。今回dbではPostgreSQLを指定します。

version: "3.9"
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/docker_demo
    ports:
      - "3000:3000"
    depends_on:
      - db
db/web以外の名称でも構いませんが、基本的にデータベース情報はdb、ウェブアプリケーションはwebと記載します。

version: "3.9"
docker-composeのバージョン

services:
services配下にコンテナを定義(今回はwebとdbのみ)

image: postgres
利用するイメージの指定(今回はPostgreSQL)

volumes:
データを永続的に保存する場所を指定(コンテナ削除時にデータも削除されてしまうことを防ぐことができる)

environment:
PostgreSQLに関する環境変数の設定(今回はパスワードを設定)

build: .
Dockerfileがあるディレクトリを指定

command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
Railsサーバーの起動(既にserver.pidファイルが存在していた場合は削除)

volumes:
データを永続的に保存する場所を指定

ports:
ポート番号

depends_on:
コンテナの実行順序の指定(今回はdb起動→web起動)

Railsアプリケーションの作成

ここでRailsの新規アプリケーションを作成します。

docker_demo % docker-compose run --no-deps web rails new . --force --database=postgresql

--force
Gemfileの上書き

--no-deps
リンクされたコンテナを起動させない

--database=postgresql
DBの指定(今回はPostgreSQL)

--skip-bundle
bundle installのスキップ

ビルド実行

rails newで作成した新規アプリケーションのGemfileを更新するため、ビルドを実行します。% docker-compose buildでビルドが実行されます。

% docker-compose build

database.ymlの編集

デフォルトではRailsはlocalhost上でDBが動作してしまうため、先ほど記述したDBコンテナを動作先に指定しましょう。config/database.ymlのdefault部分を以下のように編集します。

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 } %>

↓ 以下に変更

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  pool: 5

DBの作成

以下のコマンドでDBを立ち上げます。

% docker-compose run web rails db:create
Creating docker_demo_web_run ... done
Created database 'docker_demo_development'
Created database 'docker_demo_test'

アプリケーションの起動

ここまででDockerの設定を一通り終了しました。後はdocker-copmpose upでアプリケーションを立ち上げましょう。

% docker-compose up

動作確認

これでDocker環境下でRailsを動かす手順が完了しました。あとはhttp://localhost:3000/にアクセスし、以下のようなデモ画面が表示されれば成功です。

Railsデモ画面

構築手順ざっくりまとめ

  • Docker Desktop for Macのインストール
  • 開発フォルダの作成
  • Dockerfileの作成
  • Gemfileの作成
  • Gemfile.lockの作成
  • entrypoint.shの作成
  • docker-compose.ymlの作成
  • Railsアプリケーションの作成
  • ビルド実行
  • database.ymlの編集
  • DBの作成
  • アプリケーションの起動
  • 動作確認

参考

 

 

今回はRuby3.1.0/Rails7.0.1のサンプルアプリケーションをDocker環境で動かすまでの手順についてまとめました。基本的にはチュートリアル通りですので、ご自身でも試しに取り組んでみてはいかがでしょうか。