🚎
RailsウェブアプリをDocker化する
今記事では前回の記事で作成したウェブアプリをDockerでコンテナ化します。
Dockerfileを作成する
Dockerfile
で行うことは基本的にパッケージやライブラリのインストールです。
まず、Rubyのインストール。
postgresql-client
のインストール。
ワーキングディレクトリの設定。
Gemfile
とGemfile.lock
をコピー。
bundler
のインストールとアップデート。
yarn
コマンドのインストール。
そしてgem
とyarn
パッケージのインストール。
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