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'
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