Dockerを使ってRailsアプリケーションの作成・起動を行う

2021-02-22Rails,Ruby

はじめに

いままで Ruby on Rails については触れたことはなかったのですが、習得の必要性が生まれたためチュートリアルをはじめました。

rails コマンドを実行するための環境セットアップに随分時間がかかってしまったため、
整備して次回からはまらないようにしたいと思いエントリを投稿しました。

検証環境

$ uname -moi
x86_64 MacBookPro11,4 Darwin

$ docker --version
Docker version 19.03.8, build afacb8b

準備

タイトル通り、今回は Docker を利用してアプリケーションの新規作成や起動を行うため、 Docker をインストールしておきましょう。(ここではDockerのインストール方法は取り上げません。)

rails コマンド実行用のDockerイメージ

rails コマンドを簡単に実行するためのDockerイメージを自作し公開しています。
こちらを利用したいと思います。

以下のコマンドを実行し、バージョンが表示されればDockerイメージを利用する準備は完了です。

# Railsバージョンは5.2.3としています。
# 別のバージョンを利用したい場合はDockerイメージタグの値を変更してください。
$ docker run --rm genzouw/rails:5.2.3 rails --version
Rails 5.2.3

アプリケーションの作成

アプリケーションを作成するには rails new コマンドを実行します。
先程のDockerイメージを使って、 rails new コマンドを実行します。

rails-tutorial というアプリケーション名で作成します。

docker run コマンドのオプションについて補足しておきます。

  • --rm オプションは実行後にDockerコンテナ内のファイル変更内容を残さないオプションです。
    • あってもなくても良いのですが、PCの不要なディスク消費を抑えるために付与。
  • -v $PWD:/app:cached オプションで、カレントディレクトリをコンテナの /app ディレクトリにマウントします。
  • --workdir /app オプションで、コンテナ内のカレントディレクトリを /app ディレクトリとします。
$ docker run --rm -v $PWD:/app:cached --workdir /app \
  genzouw/rails:5.2.3 \
  rails new rails-tutorial

問題なくアプリケーションを作成できたら、カレントディレクトリを変更しておきます。

$ cd rails-tutorial/

依存パッケージのインストール

bundle コマンドを使って、依存パッケージをインストールします。
依存パッケージの設定は Gemfile に記述されています。

rails new コマンドで作成した直後はSQLiteデータベースを使って動作するようになっていますが、最新バージョンでは正常に動作しないため 1.3.x バージョンを利用するように書き換えておきます。

また本番環境ではPostgreSQLを利用したいため(Heroku利用を想定)、 pg パッケージを追加しておきます。

# SQLiteのバージョンを変更
$ sed -i "s/gem 'sqlite3'/gem 'sqlite3', '~> 1.3.6'/" Gemfile

# PostgreSQL用のパッケージを追加
$ cat <<EOF >>Gemfile

group :production do
  gem 'pg', '0.20.0'
end
EOF

bundle install を実行します。
実行時のオプションは環境変数で指定します。Dockerの -e オプションを指定して環境変数を設定します。

$ docker run --rm -v $PWD:/app:cached --workdir /app \
  -e BUNDLE_APP_CONFIG="/app/.bundle" \
  -e BUNDLE_SET="path vendor/bundle" \
  -e BUNDLE_DISABLE_SHARED_GEMS="true" \
  -e BUNDLE_PATH="vendor/bundle" \
  -e BUNDLE_JOBS="10" \
  genzouw/rails:5.2.3 \
  bin/bundle install

アプリケーションの起動

アプリケーションを起動します。
rails server コマンドで開発用サーバを起動できますが、外部からアクセスするために -b 0.0.0.0 オプションを設定しておきます。

開発用サーバはコンテナ内で3000ポートを使って起動しているため、3000ポートを外部に公開します。

$ docker run --rm -v $PWD:/app:cached --workdir /app \
  -e BUNDLE_APP_CONFIG="/app/.bundle" \
  -e BUNDLE_SET="path vendor/bundle" \
  -e BUNDLE_DISABLE_SHARED_GEMS="true" \
  -e BUNDLE_PATH="vendor/bundle" \
  -p 3000:3000 \
  genzouw/rails:5.2.3 \
  bin/rails server -b 0.0.0.0

ひとこと

最後の「アプリケーションの起動」は、コマンド実行後30秒ほどまたないとサーバが正しく起動しない場合がありました。
原因がわからない。。

2021-02-22Rails,Ruby