🐵
サクッとDocker+Rails7.13+Mysqlの環境構築
はじめに
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