【Ubuntu 22.04】docker-composeを使ってRails7.0.4のコンテナを作ってみる
先日, Ubuntu22.04にDocker Desktopをインストールしたので, 今回はRuby on Railsの開発環境を構築してみたいと思います。
具体的にはRailsのイメージを作ってコンテナを起動するところまでを扱います。
そして元とするページはDocker-docs-ja20.10のページを参考にしつつ進めていこうと思います。
Docker本家ページには残念ながらRailsの環境構築のマニュアルは載っていませんでした。
自分の探し方が悪いのか…はたまたもうRailsは下火になってきているから載っていないのかわかりませんが、残念です。
とはいえ、参考にしているページはRuby2.3, Rails5.0なのでバージョンが古いため、できる限りRails7.0以上でイメージを作ってみたいと思います。
手順としては, 以下の感じで進めて行きます。
- Dockerfile, Gemfile, Gemfile.lock, docker-compose.ymlを作る
- イメージをビルドし, コンテナを作り, Rails newする
- Gemfileが更新されるのでイメージを作り直す
- 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に接続

お疲れ様でした!
ディスカッション
コメント一覧
まだ、コメントがありません