【Ubuntu 22.04】docker-composeを使ってRails7.0.4のコンテナを作ってみる

Docker

先日, Ubuntu22.04にDocker Desktopをインストールしたので, 今回はRuby on Railsの開発環境を構築してみたいと思います。
具体的にはRailsのイメージを作ってコンテナを起動するところまでを扱います。

そして元とするページはDocker-docs-ja20.10のページを参考にしつつ進めていこうと思います。
Docker本家ページには残念ながらRailsの環境構築のマニュアルは載っていませんでした。

自分の探し方が悪いのか…はたまたもうRailsは下火になってきているから載っていないのかわかりませんが、残念です。
とはいえ、参考にしているページはRuby2.3, Rails5.0なのでバージョンが古いため、できる限りRails7.0以上でイメージを作ってみたいと思います。

手順としては, 以下の感じで進めて行きます。

  1. Dockerfile, Gemfile, Gemfile.lock, docker-compose.ymlを作る
  2. イメージをビルドし, コンテナを作り, Rails newする
  3. Gemfileが更新されるのでイメージを作り直す
  4. database.ymlを変更してコンテナを起動する

Dockerfileを作成する

まず, 適当な作業フォルダを作成し, その中にイメージの元となるDockerfileを作成します。
DockerfileはDocker deamon上でコンテナを作る際の設計図, および手順書のような認識を持っています。

FROM ruby:3.1.2
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /rails-mailer
WORKDIR /rails-mailer
ADD Gemfile /rails-mailer/Gemfile
ADD Gemfile.lock /rails-mailer/Gemfile.lock
RUN bundle install
ADD . /rails-mailer

今回作成するプロジェクト名(ディレクトリ名)は, 今後勉強したい内容がAction Mailerであるため, 「rails-mailer」としています。

Gemfileを作成する

次に, Gemfile, Gemfile.lockの2つを作成します。作る場所はDockerfileと同様のディレクトリです。

source 'https://rubygems.org'
gem 'rails', '7.0.4'

Gemfileはこのあとの手順で`rails new`するため, Railsだけ書いておきます。
Gemfile.lockはtouchしておくだけで良いです。

docker-compose.ymlを作成する

先日Docker Desktopをインストールするときにdocker-composeもインストールしているので, 使ってみたいと思います。

version: '3'
services:
  db:
    image: postgres
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/rails-mailer
    ports:
      - "3000:3000"
    depends_on:
      - db

イメージのビルドとコンテナの作成

docker-composeを使って, 以下のことを一気に実行します。

  • DockerfileのFROMからベースイメージをビルドする
  • Dockerfileの手順に沿ってコンテナを作成する
  • 作成されたコンテナの中でrails newする

上記をおこなうコマンドが以下となります。

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

イメージのビルド, コンテナの作成に成功するとDocker Desktopで作成されたイメージ, コンテナがGUIでも確認できます。

ここで自分は`Could not find gem 'sprockets-rails’ in locally installed gems.`のエラーとなり, 最後のbundle installが通りませんでした。
解消法は後日まとめてまた書きますが, ホストOSでbundle installしてからdocker-compose build(イメージを再ビルド)をおこなうことで解消しました。

上記のエラーにならなかった場合は, Rails new したことによってGemfileにたくさんのGemが追加されたので, イメージをビルドし直せばOKです。

docker-compose build

これで上図のようにイメージをリビルドできました。

databese.ymlの書き換え

デフォルトではRailsはlocalhostのDBを使うよう設定されているので, 作成したDBコンテナを使うように設定を書き換えます。

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: "<%= ENV['POSTGRES_USER'] %>"
  password: "<%= ENV['POSTGRES_PASSWORD'] %>"
  pool: 5

development:
  <<: *default
  database: myapp_development


test:
  <<: *default
  database: myapp_test

あらためてコンテナを起動

Gemfileの内容でイメージをビルドし直し, database.ymlを修正したのでその内容でコンテナを起動してみます。

docker-compose up

最後にデータベースを作成して, Railsを起動してみます。

docker-compose run web rake db:create

http:localhost:3000に接続

お疲れ様でした!