Rails7 + MySQL8.0 の開発環境をdocker compose で作成する
はじめに
本記事では、Dockerを利用して Rails7 と MySQL8.0 の開発環境を構築する方法を解説します。あらかじめDockerがインストールされていることを前提に進めますので、未インストールの場合は別記事などを参考にセットアップを行ってください。
本記事の流れは以下の通りです。
- コンテナのビルド
- Railsアプリケーションの作成
- データベースの準備
- コンテナの起動と動作確認
前準備
まずは、アプリケーション用のディレクトリを作成します。
mkdir sample-app
cd sample-app
続いて、環境構築に必要な以下の5つのファイルを作成します。
touch Dockerfile.develop docker-compose.yml Gemfile Gemfile.lock entrypoint.sh
Dockerfile.develop
という名前にしている理由は、rails new
実行時に作成されるDockerfile(本番用)とコンフリクトして上書きされないようにするためです。
各ファイルの編集
Gemfile
Gemfileは、Railsアプリケーションで利用するgemを定義するファイルです。まずはRails本体のみを指定します。
source 'https://rubygems.org'
gem 'rails'
Gemfile.lock
Gemfile
に記載したgemのバージョン情報が記録されるファイルです。
このファイルは自動で更新されるため、ここでは何も記述する必要はありません。
Dockerfile.develop
Dockerfile
は、Dockerイメージの作成手順を記述するファイルです。
今回は、公式のrubyイメージ(3.2.2)をベースにRails環境を構築します。
# 利用するイメージとバージョンを指定。
FROM ruby:3.2.2
# 作業ディレクトリを指定。なんでも大丈夫。
WORKDIR /app
# ホストマシンのファイルをコンテナ内の作業ディレクトリにコピーする。
COPY Gemfile Gemfile.lock /app/
# Gemfile内に書かれたgemを一括でインストールする。
RUN bundle install
# ホストマシンのファイルを全てコンテナ内の作業ディレクトリにコピーする。
COPY . /app/
# entrypoint.sh をコンテナ内の作業ディレクトリにコピーする。
COPY entrypoint.sh /usr/bin/
# entrypoint.shの実行権限を付与
RUN chmod +x /usr/bin/entrypoint.sh
# コンテナ起動時にentrypoint.shを実行するように設定
ENTRYPOINT ["entrypoint.sh"]
# コンテナ実行時に実行するコマンドを指定
CMD ["rails", "server", "-b", "0.0.0.0"]
entrypoint.sh
コンテナ起動時に実行されるスクリプトです。
tmp/pids/server.pid
が残っている場合に削除し、サーバーの起動を妨げないようにします。
#!/bin/bash
set -e
# server.pidファイルを削除する
rm -f /app/tmp/pids/server.pid
# コンテナのメインプロセス(CMDコマンドの中身)を実行する
exec "$@"
docker-compose.yml
docker-compose.yml
は、複数のコンテナを定義し、一括で起動・管理できる設定ファイルです。
今回は Rails アプリ(web
)と MySQL(db
)の2つのサービスを構成します。
version: '3'
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: sample_app_development
MYSQL_USER: user
MYSQL_PASSWORD: password
ports:
- '3306:3306'
volumes:
- mysql_volume:/var/lib/mysql
web:
build:
context: .
dockerfile: Dockerfile.develop # 最初に作成したDockerfileを指定
ports:
- '3000:3000'
stdin_open: true
tty: true # コンテナを起動させ続ける
depends_on:
- db
volumes:
- .:/app
volumes:
mysql_volume:
db
というサービスはMySQLのコンテナ、web
というサービスはRailsアプリのコンテナに相当します。
Rails プロジェクトの作成
Rails プロジェクトをweb
コンテナ内で作成します。
以下のコマンドを実行してください。
docker-compose run --rm web rails new . --force --database=mysql
--force
をつけることで、既存ファイルを上書きします。
Dockerコンテナイメージのビルド
作成したdocker-compose.yml
およびDockerfile
を元に、コンテナイメージをビルドします。
docker-compose build
MySQLデータベースの設定
Rails プロジェクト作成時に自動生成されたconfig/database.yml
を編集し、MySQL
コンテナに接続できるようにします。
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: user
password: password
host: db
development:
<<: *default
database: sample_app_development
test:
<<: *default
database: sample_app_test
ここで host: db
は、docker-compose.yml で定義したdb
サービス名を使用しています。
データベースの作成
データベースを作成するため、以下のコマンドを実行します。
docker-compose run --rm web rails db:create
コンテナの起動
開発環境を立ち上げるため、次のコマンドでコンテナを起動します。
-d
オプションはバックグラウンド実行を意味します。
docker-compose up -d
画面表示の確認
ブラウザで以下のURLアクセスし、Railsの初期画面が表示されれば環境構築は完了です。
http://localhost:3000/
参考にした記事
Discussion