Rails

Rails7をDockerで起動する

Rails7をDockerで起動する手順をまとめます。

基本的にはDockerの公式に載っている手順です。ただ公式ではRailsのバージョン5, Ruby2.5になっているのでこれを変更していきます。

Railsのバージョンは7.02、Rubyは3.1.0にします。
Rails 7.0.0はRuby 3.1.0に対応していないので注意してください。

参考:Ruby 3.1に対応したRails 7.0.1がリリース。「Ruby 3.1 on Rails 7」が実現

Rails : 7.0.2
Ruby:3.1.0
DB:postgreSQL

Rails7をDockerで起動する手順

Dockerfileを作成する

Railsファイルを作成するディレクトリに移動した後、Dockerfile を作成します。

$ touch Dockerfile

Dockerfile は以下のように書きます。

FROM ruby:3.1.0
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]

次はGemfile を作成します。
GenmfileにはRails のバージョンを指定します。

$ touch Gemfile
source "https://rubygems.org"
gem 'rails', '~> 7.0', '>= 7.0.2.2'

rails 7.0.2.2

Gemfile.lock を作成します。
Gemfile.lock には何も書かなくて大丈夫です。DockerをbuildするときにGemfileの内容が反映されます。

$ touch Gemfile.lock

Rails固有の問題を解決するためにentrypoint.sh を作成します。
このファイルはDockerのコンテナを起動するたびに実行されます。

$ touch entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

最後はdocker-compose.yml を作成します。

$ touch docker-compose.yml
version: "3.9"
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

ここまでで必要なファイルをぜんぶ作成できました。
これからビルドをしていきます。

$  docker-compose run --no-deps web rails new . --force --database=postgresql

これでRailsのファイルを作成できたはずです。
ls コマンドを使ってファイルが作成できているかを確認してみてください。

↑でrails newできたので、Gemfileが更新されています。
その内容を反映させるために、もう一度ビルドをします。

 $ docker-compose build

ここまででRailsを起動する準備はできました。
でもDB用のコンテナの準備はできていないので、rails newしたときに作成されたconfig/database.yml を修正します。

default: &default
  adapter: postgresql
  encoding: unicode
- # For details on connection pooling, see Rails configuration guide
- # https://guides.rubyonrails.org/configuring.html#database-pooling
- pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
+ host: db
+ username: postgres
+ password: password
+ pool: 5

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

* default: &default を修正すれば大丈夫だと思います(僕の環境ではそうでした)。

ここまででdocker-composeでRailsを起動できるようになりました。
起動してみましょう。

$ docker-compose up

最後にデータベースを作成する必要があります。
↑で docker-compose up したターミナルとは別のターミナルを開き、以下のコマンドを実行します。

 docker-compose run web rake db:create

これでRailsを実行できるはずです。localhost: 3000 にアクセスしてみましょう。
うまくいけば以下の画面が表示されるはずです。

Railsを終了するには以下のコマンドを入力します。

$ docker-compose down