【Rails7.0+Docker】Rails7.0をDockerで動かすためにやったこと

Ruby on Rails

こんにちは、ジョンです!
Rails7.0、正式リリースされましたね!
すごくお恥ずかしい話、正直webpackerがあまり得意ではなかったため、
フロントが強化されたRails7.0、どんな感じかワクワクしております。

今回は、なにもないマッサラな状態から、Docker上にRails7.0を作り、
ローカル開発ができるようになるところまでセットアップできたので、
今後の備忘録も兼ねて、共有したいと思います。

スポンサーリンク

構成

  • 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こんな機能あるすげえええ!
みたいな記事は書けませんが、これから色々触ってみたいと思います。

正直フロント周りの知識が乏しく、苦手意識も持っていたので、
年末年始のお休みを使ってしっかり勉強し、少しでも苦手意識を減らそうと思います。

タイトルとURLをコピーしました