🐵

サクッとDocker+Rails7.13+Mysqlの環境構築

2024/02/12に公開

はじめに

Docker + Rails 7.1.3 + MySQL というよくある構成で環境構築をしたところ、Rails 7.1 でリリースされた Dockerfile の自動生成機能によって、元々書いていた Dockerfile が上書きされてしまい、色々と詰まったのでメモしました。

実行環境

  • M2 mac mini
  • Rails 7.1.3
  • Ruby 3.2.3
  • Mysql 8.0
  • Docker 25.0.2
  • vscodeエディタ

任意のディレクトリを作成

mkdir sample_rails && cd sample_rails

必要ファイルの作成

touch {Dockerfile.dev,compose.yml,.env,Gemfile,Gemfile.lock,entrypoint.sh}
  • Dockerfile.dev
  • compose.yml
  • .env
  • Gemfile
  • Gemfile.lock
  • entrypoint.sh

Dockerfile.dev

ruby:3.3のバージョンで指定でうまく構築できなかったので3.2.3にしてあります。

Dockerfile.dev
FROM ruby:3.2.3

# コンテナの作業ディレクトリ
WORKDIR /app

# コンテナの作業ディレクトリにコピー
COPY Gemfile Gemfile.lock /app/

# 依存関係をインストール
RUN bundle install

COPY entrypoint.sh /usr/bin/
# プロジェクト作成時はコメントアウト(コンテナが立ち上がらないため)
# RUN chmod +x /usr/bin/entrypoint.sh
# ENTRYPOINT ["entrypoint.sh"]

EXPOSE 3001

# プロジェクト作成時はCMDをコメントアウト(コンテナが立ち上がらないため)
# CMD ["rails", "server", "-b", "0.0.0.0"]

compose.yaml

compose.yaml
services:
  web:
    container_name: sample_app
    build:
      context: .
      dockerfile: Dockerfile.dev
    # プロジェクト作成時はcommandをコメントアウト(コンテナが立ち上がらないため)
    # command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app
    env_file:
      - .env
    ports:
      - ${RAILS_PORT}:3000 # 環境変数から参照
    tty: true
    # 標準入出力とエラー出力をコンテナに結びつける設定。
    stdin_open: true
    depends_on:
      - db
  # MySQLの設定
  db:
    container_name: sample_db
    image: mysql:8.0
    volumes:
      - db-data:/var/lib/mysql
    environment:
      MYSQL_DATABASE: ${MYSQL_DB} # 環境変数から参照
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} # 環境変数から参照
      TZ: "Asia/Tokyo"
    ports:
      - "${MYSQL_POOT}:3306" # 環境変数から参照
volumes:
  db-data:

.env

.env
MYSQL_DB= sample_db
MYSQL_USER=root
MYSQL_POOT=3307
MYSQL_ROOT_PASSWORD=password
RAILS_HOST=0.0.0.0
RAILS_PORT=3001

Gemfile

Gemfile
source 'https://rubygems.org'
gem 'rails'

Gemfile.lock(何も記述しない)

Gemfile.lock

entrypoint.sh

entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

コンテナイメージ作成

docker compose build

コンテナの起動

docker compose up -d

Railsプロジェクトの作成

docker-compose exec web rails new . -f -d mysql -T
  • -f 既存のファイルがある場合は上書き
  • -d データベースを指定
  • -T テストファイルを生成しない

生成されたDockerfileのファイル名変更

Rails7.1から本番用のDockerfileが自動で生成されるのでファイル名をDockerfile.prodに変更。

Dockerfile.prod
# syntax = docker/dockerfile:1

# Make sure RUBY_VERSION matches the Ruby version in .ruby-version and Gemfile
ARG RUBY_VERSION=3.2.3
FROM registry.docker.com/library/ruby:$RUBY_VERSION-slim as base

# Rails app lives here
WORKDIR /rails

# Set production environment
ENV RAILS_ENV="production" \
    BUNDLE_DEPLOYMENT="1" \
    BUNDLE_PATH="/usr/local/bundle" \
    BUNDLE_WITHOUT="development"

--------------省略--------------

.gitignoreに.envを追加

.gitignore
.env

DBの設定

.config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  database: <%= ENV.fetch("MYSQL_DB") { '' } %> #.env 環境変数を参照
  username: <%= ENV.fetch("MYSQL_USER") { '' } %> #.env 環境変数を参照
  password: <%= ENV.fetch("MYSQL_ROOT_PASSWORD") { '' } %> #.env 環境変数を参照
  host: db #docker-compose.ymlのDBのサービス名を指定

development:
  <<: *default
  database: <%= ENV.fetch("MYSQL_DB") { '' } %>_development #.env 環境変数を参照

test:
  <<: *default
  database: <%= ENV.fetch("MYSQL_DB") { '_test' } %>_test #.env 環境変数を参照

# production プロジェクトに合わせて修正。
production:
  <<: *default
  database: app_production
  username: app
  password: <%= ENV["APP_DATABASE_PASSWORD"] %>

DBの作成

docker-compose exec web rails db:create

Dockerfile.devとcompose.yamlのコメントアウトを外す

Dockerfile.dev
# RUN chmod +x /usr/bin/entrypoint.sh
# ENTRYPOINT ["entrypoint.sh"]
CMD ["rails", "server", "-b", "0.0.0.0"]
compose.yaml
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3001 -b '0.0.0.0'"

コンテナイメージの再作成とコンテナの起動

docker compose build
docker compose up -d

サーバー起動

ブラウザで http://localhost:3001/ を開きます。
環境構築が出来ていれば、画像のページが表示されます。

終わり

以上でDocker+Rails7.13+Mysqlの環境構築となります。自分用にアレンジしてみて使ってみてください。

Discussion