はじめに
DockerでRailsとMySQLの環境を構築するにあたって、調べてもよくわからない設定があったりして混乱したので、とりあえずRailsアプリケーションが動かせる最低限の環境を作り、この状態から必要な要素を随時追加していくというやり方を取りました。
ディレクトリ構成
.
├── .devcontainer
│ └── devcontainer.json
├── .gitignore
├── app
│ ├── Gemfile
│ └── Gemfile.lock
├── compose.yml
└── docker
├── api
│ └── Dockerfile
└── db
今回は構成要素が少ないので、docker/
以下のDockerfile
はプロジェクトルートに配置するプレーンな構成の方がわかりやすかったかもしれません。
以下で紹介する以外のファイルは無くても問題ありませんが、ディレクトリ構成を変更する場合はDockerfile
及びcompose.yml
の編集が必要になる場合があります。
各ファイルの準備
コンテナ内でRailsプロジェクトを生成するため、Gemfileに下記の内容を記述しておきます。
source "https://rubygems.org"
gem "rails", "~> 7.0.5"
FROM ruby:3.2.2
WORKDIR /app
COPY app/Gemfile* ./
RUN bundle install
CMD ["rails", "server", "-b", "0.0.0.0"]
version: "3.9"
services:
api:
build:
context: .
dockerfile: ./docker/api/Dockerfile
ports:
- "3000:3000"
depends_on:
- db
stdin_open: true
tty: true
volumes:
- ./app:/app
db:
image: mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: password
環境構築
最初にイメージをビルドします。
$ docker compose build
下記のコマンドでコンテナ内にRailsプロジェクトを生成します。
Dockerfile
でWORKDIR /app
を指定し、下記のコマンドで.
を使ってカレントディレクトリ指定することで、コンテナ内の/app
にプロジェクトが展開されて生成されます。
compose.yml
に設定を記述しているので、ホスト側にもプロジェクトの内容が同期されます。
docker compose run --rm api rails new . --database=mysql --api
上記のコマンドによって/app
内に新たなGemfileが生成されますが、既にGemfileが存在しているため下記の表示が出て一時ストップされます。
既存の内容は置き換えてしまって問題ないので、Yを入力するかEnterでそのまま進めます。これで新しいRailsプロジェクトに適したデフォルトの Gemfile が生成されます。
conflict Gemfile
Overwrite /app/Gemfile? (enter "h" for help) [Ynaqdhm]
この後設定ファイルを編集する必要があるのですが、Dockerコンテナ内で作成されたファイルはroot
として作成されるため、ホスト側から編集しようとするとパーミッションエラーが発生します。
その前に下記のコマンドでカレントディレクトリ以下の全てのファイルとフォルダのオーナーを現在のユーザーに変更します。
sudo chown -R $USER:$USER .
データベースへの接続にcompose.yml
で指定したパスワードとサービス名を使用するため、ホスト側からapp/config/database.yml
を下記のように編集します。内容は適宜置き換えてください。
default: &default
# 省略
password: password
host: db
再度ビルドしてコンテナを起動します。
docker compose build
docker compose up -d
この状態で http://localhost:3000/ にアクセスすると、ActiveRecord::NoDatabaseError
というエラーメッセージが表示されます。
データベースが作成されていないことが原因なので、下記のコマンドでデータベースを作成します。
docker compose run --rm api rails db:create
再度 http://localhost:3000/ にアクセスすると無事に起動できているはずです。
あとがき
Dockerは便利ですがまだ不慣れで、必要な設定の選定がいつも大変です。アドバイス等がありましたら、ぜひご教授いただきたく存じます。