Dockerを使ってRailsアプリケーションの作成・起動を行う
はじめに
いままで 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秒ほどまたないとサーバが正しく起動しない場合がありました。
原因がわからない。。
ディスカッション
コメント一覧
まだ、コメントがありません