こんにちは、株式会社Pentagonでアプリ開発をしている中原です。
この記事では、Docker+Rails+Mysqlの開発環境を構築する方法について説明します。Railsを開発する際には、環境構築が必要です。しかし、開発者によってOSやバージョンが異なり、環境構築に失敗する場合があります。Dockerは、環境をコンテナに分離することで、OSやバージョンに依存しない開発環境を構築することができます。これにより、開発者は同じ環境で開発を進めることができ、エラーや不具合を減らすことができます。
【こんな人に読んで欲しい】
- Railsの環境構築に挫折した方
- これからRailsを開発するエンジニア
【この記事を読むメリット】
- Docker+Rails+Mysqlの開発環境を構築することができる。
【結論】
本記事を読み実装を行えれば、Docker+Rails+Mysqlを使用した開発環境を構築することができます。Doclerを起動後、http://localhost:3001/ にアクセスし、Railsページが表示されれば成功です。みなさん、Railsの開発ライフを楽しみましょう。
環境構築を行う各バージョン
- Ruby version: ruby 3.2.2
- Rails version: 7.0.6
- Mysql version 8.0
前提条件
- Docker Desktopインストール済み
- vscode インストール済み
環境構築手順
1.任意のディレクトリを作成
今回はdocker_rails7として作成します。
mkdir docker_rails7
2.各必要ファイルを作成、編集
各必要ファイルを作成、編集します。
- Dockerfile Docker
- docker-compose.yml
- Gemfile
- Gemfile.lock
- entrypoint.sh
- .env
touch {docker-compose.yml,Dockerfile,Gemfile,Gemfile.lock,entrypoint.sh,.env}
Dockerfile
Dockerfile
はイメージをビルドするための手順が書かれたテキストファイルになります。Rubyのインストールに必要な情報を記述します。
# 最新のrubyイメージを取得
FROM ruby:3.2.2
# 環境変数
ENV APP_HOME /app
ENV TZ Asia/Tokyo
ENV PORT 3001
ENV HOST 0.0.0.0
# WORKDIR:作業ディレクトリ
WORKDIR ${APP_HOME}
# ローカルのGemfileをコンテナ内の/app/Gemfileに
COPY Gemfile ${APP_HOME}/Gemfile
COPY Gemfile.lock ${APP_HOME}/Gemfile.lock
# Rails7ではWebpackerが標準では組み込まれなくなったので、yarnやnodejsのインストールが不要
RUN apt-get update
RUN apt-get install -y \
git
# Gemをアップデート
RUN bundle install
COPY . ${APP_HOME}
# コンテナ起動時に実行させるスクリプト
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE ${PORT}
# コンテナ実行時にRails サーバ起動
CMD ["bundle", "exec", "rails", "server", "-b", ${HOST}]
docker-compose.yml
アプリケーションを動かすための設定を記述します。web
にはRails
、DB
にはMysql
についての設定を記述します。
version: '3'
services:
# Railsの設定
web:
# build: .でdocker-compose.ymlと同じフォルダにDockerfileがあることを示す
build: .
# 事前に手元で/tmp/pids/server.pidを削除する
command: /bin/sh -c "rm -f tmp/pids/server.pid && rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/app
env_file:
- .env
ports:
- ${RAILS_PORT}:3000 # 環境変数から参照
# true を指定することでコンテナを起動させ続けることができる。
tty: true
# 標準入出力とエラー出力をコンテナに結びつける設定。
stdin_open: true
# 起動順を制御する
depends_on:
- db
links:
- db
# Mysqlの設定
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:
- "3307:3306"
restart: always
volumes:
db-data:
Gemfile
アプリケーションが依存する Ruby の Gem を指定するためのファイルになります。
はじめにRailsのgemを記述します。バージョン指定がない場合は、最新の安定版になります。
バージョンを指定したい場合はgem 'rails', '7.0.6'
と記述します。
source 'https://rubygems.org'
gem 'rails'
Gemfile.lock
Gemfile.lock
はアプリケーションが使用している Gem の正確なバージョンを保存するためのファイルになります。docker-compose exec web bundle install
コマンドでgemをインストールした際にGemfile.lock
が上書きされるので何も記載する必要がありません。
entrypoint.sh
初回起動時のみに処理したい内容を記述します。
server.pid
ファイルを消す内容を記述しています。
#!/bin/sh
set -e
rm -f /app/tmp/pids/server.pid
exec "$@"
.env
環境変数を記載します。
MYSQL_DB= docker_rails7
MYSQL_USER=root
MYSQL_ROOT_PASSWORD=password
RAILS_HOST=0.0.0.0
RAILS_PORT=3001
3.Railsプロジェクトの作成
今回のプロジェクトは、APIのみを作成します。データベースはMySQLを使用し、テストフレームワークはRSpecを使用します。以下のコマンドを実行して、Railsのプロジェクトを作成してください。
docker-compose run web bundle exec rails new . -f -d mysql -api -T -B
- -f ファイルが存在する場合上書きして作成するためのコマンド。
- -d mysql データベースをmysqlに変更。
- -api APIのみのアプリケーションを生成
- -T テストを作成しない。他のテストフレームワークを使用したい場合に指定。
- -B bundle installしない
4.Dockerイメージ作成
docker-compose build
5.コンテナの立ち上げ
docker-compose up -d
6.環境変数.env
を読み込ませるための設定
dotenv-railsのgemを追加
環境変数.env
を読み込むために、dotenv-railsのgemを追加します。
------省略------
## 環境変数
gem 'dotenv-rails'
group :development, :test do
# See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
gem "debug", platforms: %i[ mri mingw x64_mingw ]
end
------省略------
追加したgemのインストール
docker-compose exec web bundle install
7.DBの設定
database
、username
、password
は環境変数.env
に設定した設定を指定します。
またhost
にはdocker-compose.ymlで設定した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 #localhostからdocker-compose.ymlのDBのサービス名を指定
development:
<<: *default
database: <%= ENV.fetch("MYSQL_DB") { '' } %>_development #.env 環境変数を参照
test:
<<: *default
database: <%= ENV.fetch("MYSQL_DB") { '' } %>_test #.env 環境変数を参照
------省略------
8.DBの作成
データベースを以下のコマンドで作成します。
docker-compose exec web rails db:create
'docker_rails7_development'と'docker_rails7_test'のデータベースが作成されます。
Created database 'docker_rails7_development'
Created database 'docker_rails7_test'
9.ブラウザで確認
ブラウザで http://localhost:3001/ を開きます。
環境構築が出来ていれば、画像のページが表示されます。
まとめ
本記事を読み、環境構築ができましたでしょうか。Dockerを使用することで簡単に環境構築を行うことができます。
次回はテストフレームワークであるRSpecを使用して単体テストについて実装します。
みなさん、Railsの開発ライフを楽しみましょう。