もふもふ技術部

IT技術系mofmofメディア

Rails7 + MySQL を docker-compose で環境構築する

以前、Rails7 + PostgreSQLの環境構築をしました。

www.mof-mof.co.jp

www.mof-mof.co.jp

今回は、MySQLを使ったRails7の環境構築をしてみます。 本記事ではビルドにimportmapを使用した場合の環境構築を行なっていきます。

esbuildを使用する場合は こちらの記事 を読み替えながら こちらのボイラープレートを参考にしてみてください。

1. ファイルを準備する

まず始めに、以下の2つのファイルを作成します。

  • Dockerfile.dev
  • docker-compose.yml
  • docker-entrypoint-initdb.d/grant_privileges_to_user.sql

次に、各ファイルの中身を以下のようにしていきます。

Dockerfile.dev

FROM ruby:3.3.0-alpine

RUN apk add --no-cache git build-base libxml2-dev libxslt-dev mysql-dev mysql-client tzdata bash vim && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

ENV APP_ROOT /app
RUN mkdir $APP_ROOT
WORKDIR $APP_ROOT

ENV LANG=ja_JP.UTF-8 \
    BUNDLE_JOBS=4 \
    BUNDLE_RETRY=3 \
    EDITOR=vim
RUN gem update --system && \
    gem install --no-document bundler:2.5.7

RUN bundle config set force_ruby_platform true

docker-compose.yml

version: '3'
services:
  app:
    build:
      context: .
      dockerfile: "Dockerfile.dev"
    stdin_open: true
    tty: true
    ports:
      - 3000:3000
    command: /bin/sh -c "bundle install && rm -f tmp/pids/server.pid && bin/rails s -b 0.0.0.0 -p 3000"
    environment:
      DB_USER: mysql
      DB_PASS: mysql
      DB_HOST: mysql
    depends_on:
      - mysql
    volumes:
      - .:/app:delegated
      - bundle-data:/usr/local/bundle:delegated

  mysql:
    image: mysql:8.3
    stdin_open: true
    tty: true
    restart: always
    ports:
      - 3306:3306
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: true
      MYSQL_USER: mysql
      MYSQL_PASSWORD: mysql
      TZ: Asia/Tokyo
    volumes:
      - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
      - mysql-data:/var/lib/mysql:cached

volumes:
  mysql-data:
  bundle-data:

2. 環境構築をする

ファイルの準備ができたら、各種コマンドを実行していきます。
今回は、新規Railsプロジェクトを作成してみます。

  1. docker compose build を実行します。
  2. docker compose run --rm app gem install rails を実行します。
  3. docker compose run --rm app rails new . -d mysql を実行します。
  4. config/database.ymldefault 内を以下のように編集します。

     username: <%= ENV['DB_USER'] %>
     password: <%= ENV['DB_PASS'] %>
     host: <%= ENV['DB_HOST'] %>
    
  5. docker compose up mysql -d を実行します。
  6. docker compose run --rm app rails db:create を実行します。
    エラーになる場合は、手順5の後に少し時間を置いてみてください。
  7. docker compose stop mysql を実行します。
  8. docker compose up を実行します。
  9. http://localhost:3000/ にアクセスしてページが表示されれば完了です。
    rails newした時によくみる画面

今回のポイント

ポイント1
MySQLのrootユーザーを使用せずに環境構築をする場合 MYSQL_USER で指定したユーザーに権限が足りないため、DB作成などの操作ができません。
MySQLのコンテナ初回起動時に docker-entrypoint-initdb.d 配下のファイルが自動で実行されるので、ユーザーへ権限を付与するSQLを docker-entrypoint-initdb.d/grant_privileges_to_user.sql に記載しています。

rootユーザーを使うのが一番早くて簡単だと思いますが、rootユーザーを使わない環境構築をしてみたかったので、今回挑戦してみました。

ポイント2
rootユーザーを使用しないとはいえ、rootユーザーのパスワードを設定しないとMySQLに怒られてしまいます。
そこで今回は、rootユーザーのパスワードを自動で生成するように MYSQL_RANDOM_ROOT_PASSWORD というオプションを使用しました。
コンテナ初回起動時に自動でランダムなパスワードが生成されるので、パスワードを設定しないと怒られるということも無くなりました。

rootパスワードは、生成時に一度だけログに流れます。
パスワードを知っておきたい方は、コンテナをバックグランドで起動しないように気をつけましょう。

最後に

これでRails7の環境構築ができました!
ボイラープレートをGitHubで公開していますので是非ご活用ください!!

github.com