【Docker+Rails】Railsのトップページを表示させるまで
ドキュメントルートにindex.phpを置けば表示されちゃうPHPに比べると、Railsを触り始めたころはとにかく「なんか表示される」までの道のりがつらかった記憶がありますが、最近はようやく慣れてきて、Docker環境をこしらえてRailsをインストールしてブラウザでトップ画面にアクセスするまでほぼ迷わなくなったので、手順を残しておこうと思います。
sample_appという名前のアプリケーションを作成しhttps://local-sample-app.net
にアクセスしてRailsのトップ画面を表示させるまでです。
↑の手順通りにやると、sample_appというディレクトリとwebコンテナの/appというディレクトリがマウントされており、webコンテナに接続すると/appにいるようになっています。
以下はwebコンテナに接続し、/appにいる状態からの手順です。
(sample_appとのマウントがうまくいっていれば、ここに空のGemfileとGemfile.lockがあるはず)
(dockerを利用していない場合でもRailsアプリケーションを作成したいサーバー上のGemfileのあるディレクトリで同じことをすればいいはずです)
手順
- Railsをインストールする。最新の7.1.2を入れてみます。
$ gem install rails -v 7.1.2
- rails newする(カレントディレクトリに作成)
$ rails new . -d mysql -T -a propshaft
オプションについてはここでは詳しくは触れませんが、以下の通りです。
-d mysql DBにMySQLを指定
-T テストスキップ(テストフレームワークはrspecがメジャーなため、デフォルトのminitestはスキップすることが多い)
-a アセットパイプラインにPropshaftを指定。Rails7から増えたオプションらしいです。
- 環境変数を設定
DBのパスワードはcredentialsで管理します。
$ EDITOR=vim rails credentials:edit --environment=development
ローカル環境でとりあえず表示させたいので、ユーザーもパスワードもrootです。
db:
password: root
- database.ymlを編集する
パスワードは前の手順で設定した環境変数を読み込むようにします。今回dockerを使っているのでホストはdbコンテナを指定します。docker等を利用せずすべて同じサーバー上にあるならlocalhostでよいです。
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
password: <%= Rails.application.credentials.dig(:db, :password) %>
database: sample_app
development:
host: db
username: root
<<: *default
- DBを作成
前の手順で設定した名前のDB(sample_app)が作成されます。先にdockerのDBを作っていた場合はその名前にすればよく、次の手順が不要です。
$ rails db:create
- config/environments/development.rbを編集する
require "active_support/core_ext/integer/time"
Rails.application.configure do
# 省略
config.hosts << Rails.application.credentials.dig(:host)
end
- サーバーを立ち上げてみる。
$ rails s -b '0.0.0.0'
これでブラウザでhttps://local-sample-app.net
にアクセスすればRailsのトップ画面が表示されるはず(dockerでリバースプロキシを利用してないならhttp://localhost:3000など)。
- おまけ
最初に貼った記事の通りにdocker環境を作成している場合は、ここでいったんDockerコンテナを落とし、docker-compose.ymlのwebコンテナのcommandの行のコメントアウトを戻すと、docker-compose up
でRailsサーバー立ち上げのコマンドが実行されるようになります。
Discussion