😺

Rails 7+MySQLのDocker環境構築

2024/05/03に公開

DockerでRuby 3.2 + Rails 7 + MySQL 8 の開発環境を構築する方法です。

ディレクトリと必要ファイルの作成

ターミナル
mkdir rails_app
cd rails_app
# MySQLの環境
mkdir -p db/data
touch db/my.cnf db/data/.keep 
# Railsの環境
mkdir api
touch api/Dockerfile api/Gemfile api/Gemfile.lock api/entrypoint.sh

touch compose.yml

各種設定ファイルの準備

compose.yml
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
      TZ: "Asia/Tokyo"
    volumes:
      - ./db/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./db/data:/var/lib/mysql
    ports:
      - '3306:3306'
    restart: always
  api:
    build:
      context: .
      dockerfile: ./api/Dockerfile
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -e development -p 3000 -b '0.0.0.0'"
    volumes:
      - ./api:/api
    ports:
      - '3000:3000'
    depends_on:
      - db
    stdin_open: true
    tty: true
my.cnf
[mysqld]
# 文字コード/照合順序の設定
character_set_server = utf8mb4
collation_server = utf8mb4_bin 
# デフォルト認証プラグインの設定
default-authentication-plugin = mysql_native_password
[mysql]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
api/Dockerfile
FROM ruby:3.2.2
RUN mkdir /api
WORKDIR /api
COPY ./api/Gemfile Gemfile
COPY ./api/Gemfile.lock Gemfile.lock
RUN bundle install
COPY . /api
COPY ./api/entrypoint.sh /usr/bin/entrypoint.sh
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]
api/entrypoint.sh
#!/bin/bash
set -e
rm -f /sample/tmp/pids/server.pid
exec "$@"
api/Gemfile
source 'https://rubygems.org'
gem 'rails', '~>7.0.8'
api/Gemfile.lock
# 空ファイル

Railsアプリケーションの作成

ターミナル
# apiモードで作成
docker compose run --rm api rails new . --force --no-deps --database=mysql --api --skip-test
# イメージの構築
docker compose build api

database.ymlファイル設定編集

api/config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV.fetch("MYSQL_USERNAME", "root") %>
  password: <%= ENV.fetch("MYSQL_PASSWORD", "password") %>
  host: <%= ENV.fetch("MYSQL_HOST", "db") %>

development:
  <<: *default
  database: rails_app_development

データベースの作成

ターミナル
docker compose run --rm api rails db:create

Rails 起動

ターミナル
docker compose up -d api

http://localhost:3000/ にアクセスして以下の画面が表示されればOK

Discussion