こんにちは、ジョンです!
Rails7.0、正式リリースされましたね!
すごくお恥ずかしい話、正直webpackerがあまり得意ではなかったため、
フロントが強化されたRails7.0、どんな感じかワクワクしております。
今回は、なにもないマッサラな状態から、Docker上にRails7.0を作り、
ローカル開発ができるようになるところまでセットアップできたので、
今後の備忘録も兼ねて、共有したいと思います。
よっし、Docker+Rails7、無事に立ち上がった!
色々触ってみます。 #rubyonrails pic.twitter.com/lzSHoHiOT4— ジョン@フリーランスエンジニア (@jonconan4869) December 20, 2021
構成
- iMac(M1)
- Docker 4.3.1
- Ruby on Rails 7.0
- ruby 3.0.3
- MySQL 8.0
コードを展開するディレクトリを作成
まず、ソースコードが展開されるディレクトリを用意します。
今回私は、以下にディレクトリを作成しました。
また、今回作るアプリの名前は、一旦 rails7_sampleとし、
ディレクトリの名前もアプリの名前と全く同じものにしています。
~ $ pwd
/Users/jonconan
~ $ mkdir rails7_sample
~ $ cd rails7_sample
~/rails7_sample $ pwd
/Users/jonconan/rails7_sample
Dockerの設定を実施
次に、Dockerfileとdocker-compose.yml、entrypoint.sh、Gemfile、Gemfile.lockを作成します。
全て同じ階層に置いておけば大丈夫です。
Dockerfile
# rubyのバージョンを3.0.3に指定
FROM ruby:3.0.3
# アプリ名を設定
ENV APP_NAME rails7_sample
# タイムゾーンを設定
ENV TZ='Asia/Tokyo'
RUN mkdir /${APP_NAME}
WORKDIR /${APP_NAME}
# Docker内部でGemfile、Gemfile.lockをどこに配置するかを決める記述
ADD Gemfile /${APP_NAME}/Gemfile
ADD Gemfile.lock /${APP_NAME}/Gemfile.lock
ENV BUNDLER_VERSION 2.2.3
RUN gem install bundler -v ${BUNDLER_VERSION}
RUN bundle install
COPY . /${APP_NAME}
# entrypoint.shを設定
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
# 好きなポート番号(今回は5000を指定)
EXPOSE 5000
# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
docker-compose.yml
version: '3'
volumes:
mysql-data:
services:
# Railsコンテナ定義
web:
# Dockerfileを使用してイメージをビルド
build: .
# コンテナ起動時のデフォルトコマンド
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
# 3000番をコンテナの外部に公開
# ブラウザで指定するポート番号:コンテナ内部の転送先ポート番号
ports:
- 5000:3000
# ローカルのファイルをコンテナにマウント
volumes:
- .:/rails7_sample
tty: true
stdin_open: true
# MySQLコンテナ定義
db:
platform: linux/x86_64
image: mysql:8.0
volumes:
- 'mysql-data:/var/lib/mysql'
environment:
# mysqlのルートユーザーのパスワード設定
MYSQL_ROOT_PASSWORD: password
entrypoint.sh
set -e
# server.pid を削除する
rm -f /rails7_sample/tmp/pids/server.pid
exec "$@"
Gemfile
source "https://rubygems.org"
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby "3.0.3"
gem "rails", "~~> 7.0.0"
Gemfile.lock
作成はしますが、中身はなし、空ファイルで大丈夫です。
rails new を実行する
Rails new を実行します。
私はMySQLを使用する想定なので、databaseの指定をつけて以下のコマンドを実行します。
$ docker-compose run web bundle exec rails new . --force --database=mysql
しばらくつらつらーーっとログが流れるので、少々待ちましょう。
Creating network "rails7_sample_default" with the default driver
Creating rails7_sample_web_run ... done
exist
create README.md
create Rakefile
create .ruby-version
create config.ru
create .gitignore
create .gitattributes
create Gemfile
run git init from "."
Reinitialized existing Git repository in /rails7_sample/.git/
create app
create app/assets/config/manifest.js
:
remove config/initializers/new_framework_defaults_7_0.rb
run bundle install
Fetching gem metadata from https://rubygems.org/............
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies...
:
Pin Stimulus
append config/importmap.rb
$
Gemfileを確認する
先ほど作成したGemfileに諸々追記された場合があります。
その場合は、以下のように修正します。
rubyのバージョンと、Railsのバージョンを指定します。
Railsのバージョンは、今回の本題である 7.0です。
source "https://rubygems.org"
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
# === 変更する箇所はここ ====
ruby "3.0.3"
gem "rails", "~> 7.0.0"
# === この下は特に変更なし ====
gem "sprockets-rails"
gem "mysql2"
gem "puma", "~> 5.0"
gem "importmap-rails"
gem "turbo-rails"
gem "stimulus-rails"
gem "jbuilder"
gem "tzinfo-data", platforms: %i[ mingw mswin x64_mingw jruby ]
gem "bootsnap", require: false
group :development, :test do
gem "debug", platforms: %i[ mri mingw x64_mingw ]
end
group :development do
gem "web-console"
end
group :test do
gem "capybara"
gem "selenium-webdriver"
gem "webdrivers"
end

自動生成されたコメント箇所は割愛しています。
ぶっちゃけほぼデフォルトのまんまです。
build, bundle install を実施
以下コマンドでDockerをbuildし、bundle installを実行する。
$ docker-compose build
db uses an image, skipping
Building web
[+] Building 373.5s (1/15) FINISHED
=> [internal] load build definition from Dockerfile
:(略)
$ docker-compose run web bundle install
Creating rails7_sample_web_run ... done
Using rake 13.0.6
Using concurrent-ruby 1.1.9
Using i18n 1.8.11
Using minitest 5.15.0
:(略)
Using webdrivers 5.0.0
Bundle complete! 15 Gemfile dependencies, 67 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
コンテナを立ち上げる
ここまでで設定が終わっているので、いざコンテナ立ち上げ!
$ docker-compose up -d
Creating rails7_sample_db_1 ... done
Creating rails7_sample_web_1 ... done
念の為状況を確認、エラーなどで立ち上がっていないと、 State が Up ではなく、Exit となります。
$ docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------
rails7_sample_db_1 docker-entrypoint.sh mysqld Up 3306/tcp
rails7_sample_web_1 entrypoint.sh bash -c rm - ... Up 0.0.0.0:5000->3000/tcp, 5000/tcp
テーブルを作成する
最後に、以下のコマンドでテーブルを作成します。
$ docker-compose exec web bundle exec rails db:create

結構ここ忘れがちなんですよね…笑
(個人的な感想)
いざアクセス!
ここまでの設定が間違っていなければ、ブラウザでRailsのロゴが表示されるはずです。
以下にアクセスしてみましょう!
http://localhost:5000
お疲れさまでした!!
最後に
いかがだったでしょうか?
まだまだ私も全然触れていないため、Rails7.0こんな機能あるすげえええ!
みたいな記事は書けませんが、これから色々触ってみたいと思います。
正直フロント周りの知識が乏しく、苦手意識も持っていたので、
年末年始のお休みを使ってしっかり勉強し、少しでも苦手意識を減らそうと思います。