💎

Rails7 + MySQL8.0 の開発環境をdocker compose で作成する

2025/03/12に公開

はじめに

本記事では、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/

参考にした記事

https://musclecoding.com/rails7-mysql8-docker/

Discussion