🚎

RailsウェブアプリをDocker化する

2022/01/21に公開

今記事では前回の記事で作成したウェブアプリをDockerでコンテナ化します。

Dockerfileを作成する

Dockerfileで行うことは基本的にパッケージやライブラリのインストールです。
まず、Rubyのインストール。
postgresql-clientのインストール。
ワーキングディレクトリの設定。
GemfileGemfile.lockをコピー。
bundlerのインストールとアップデート。
yarnコマンドのインストール。
そしてgemyarnパッケージのインストール。
entrypoint.shスクリプトをコピー、実行権限付与しエントリーポイントの設定。
プロジェクトディレクトリのコピー。
ポートの解放。
最後にRailsサーバーを起動します。

# syntax=docker/dockerfile:1
FROM ruby:3.0.2
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
WORKDIR /app_director_name
COPY Gemfile /app_director_name
COPY Gemfile.lock /app_director_name
RUN gem install bundler -v 2.3.0
RUN gem update --system

# install yarn
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
    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 && apt-get install -y yarn

ENV BUNDLE_PATH /gems
RUN yarn install
RUN bundle install

# コンテナー起動時に毎回実行されるスクリプトを追加
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
COPY . /rails_slides/
EXPOSE 3000

# イメージ実行時に起動させる主プロセスを設定
CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]

entrypoint.sh

entrypoint.sh
#!/bin/bash

set -e

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

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

docker-compose.ymlを作成する

このウェブアプリではウェブサーバーとDBサーバーの複数コンテナを管理する必要があるので、それを楽にするためにdocker-composeを利用します。

docker-compose.yml
version: "3.9"
services:
  db:
    image: postgres
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: postgres
  web:
    build: .
    image: dockerimagename:tag
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app_directory_name
      - bundle:/usr/local/bundle
    ports:
      - '3000:3000'
    depends_on:
      - db
volumes:
  pgdata:
    driver: local
  bundle: null

database.ymlを編集する

コンテナ化をしたら必要に応じてconfig/database.ymlを編集します。
まずhostをdbに変更します。

サーバーを起動する

ここまでを完了したら以下のコマンドでDockerイメージをビルドし、コンテナとして起動します。(初回はmigrateの前にdocker-compose run web bundle exec rails db:create

docker-compose build
docker-compose up
docker-compose run web bundle exec rails db:migrate

Herokuへデプロイ

DockerイメージをHerokuへデプロイする方法はHerokuのドキュメントに書かれていますが、具体的なコマンドは以下です。

heroku container:login
heroku container:push web -a app_name_here
heroku container:release web -a app_name_here

これでRailsウェブアプリをDockerでコンテナ化してHerokuにデプロイするのは完了です。

次回の記事ではRailsをAPIモードで利用し、Deviseを使った簡単なアプリケーションを作ろうと思います。

Discussion