なんで書いたか
DockerでRails環境を構築する記事のほとんどが(更新日が新しかったとしても)Compose V2に対応していないものとなっており、見た人がそれを再生産しまくっているせいで誰もCompose V2に対応した書き方をしてくれないため。
一応今は動くけど、非推奨になってるものもあるので早めに新しい書き方に移行しようという話です。
既存のRailsアプリをDocker化する時
# Rubyは使っているバージョンに合わせる
FROM ruby:3.1.2
RUN apt-get update && apt-get install -y nodejs npm && npm i -g yarn # Rails6用(Rails7では不要)
WORKDIR /app
COPY Gemfile Gemfile.lock ./
RUN bundle
COPY . .
ENTRYPOINT ["bash", "/app/entrypoint.sh"]
CMD ["rails", "s", "-b", "0.0.0.0"]
services:
app:
build: .
volumes:
- .:/app
ports:
- 3000:3000
#!/bin/bash
set -e
rm -f /app/tmp/pids/server.pid
exec "$@"
これの3つをプロジェクトルートに置いて
docker compose up
で起動します。なんらかの理由で再ビルドしたい場合にはdocker compose up --build
を実行します。
新規Railsアプリ作成時
Dockerfile
を一部コメントアウトしておきます。compose.yml
はそのままで。
# Rubyは使っているバージョンに合わせる
FROM ruby:3.1.2
RUN apt-get update && apt-get install -y nodejs npm && npm i -g yarn # Rails6用(Rails7では不要)
WORKDIR /app
# COPY Gemfile Gemfile.lock ./
# RUN bundle
# COPY . .
ENTRYPOINT ["bash", "/app/entrypoint.sh"]
CMD ["rails", "s", "-b", "0.0.0.0"]
以下のコマンドを実行します。x.x.x
にはRailsのバージョンを指定してください。最新バージョンで良い場合は-v
ごと消してください。
docker compose run app bash -c "gem install rails -v x.x.x && rails new ."
後はDockerfileを元に戻してdocker compose up --build
で起動します。
開発時にrails g model
等のコマンドの入力が必要になった場合には、docker compose run
コマンドを推している記事が多いですが、VSCodeのRemote - Containers拡張機能を使って、ずっとコンテナの中に入った状態で開発を進めることをお勧めします(本記事ではこの辺りの詳細な解説は行いません)。
Compose V2での変更点
V2からCompose Specに準拠しました。仕様は全部ここに書いてあるので、それを読む英語力と時間がある人はそっちを読んでください。
以下は本記事に関係ありそうな部分だけまとめています。
-
docker-compose.y(a)ml
だけでなくcompose.y(a)ml
もデフォルトの設定ファイルとして認識されるようになった-
docker-compose.y(a)ml
は後方互換のためにしばらくサポートしているだけみたいなので、compose.y(a)ml
の方を使った方が良いでしょう
-
-
docker-compose
コマンド(docker-compose up
等で使用)がdocker compose
になった-
docker-compose
コマンドも一応docker compose
コマンドのエイリアスとして今のところ使えますが、これも非推奨になる可能性があるのでdocker compose
を使うようにしましょう
-
-
compose.yml
内でversion: '3'
のようにバージョンを記述する項目が非推奨になった - ARMにネイティブ対応したので、特にM1Macで高速化された
他の記事でよく見る内容からのその他の変更点
誤解を招きがちなため、敢えて掲載しなった点がいくつかあります。
- 開発用にPostgreSQLやMySQLを用意する手順を完全に削除
- 本記事での手順のように、他のDBを導入しなければSQLiteが使われるだけです
- 初学者の方が練習用にRailsアプリを作成する際にはPostgreSQLやMySQLは難易度が高いと思い、スキップしています
-
docker compose build
はdocker compose up
時に自動で実行されるので記述していません -
docker compose up -d
で起動する派が多かったですが、ログが直に見えた方が初学者にとって分かりやすいと思い、-d
は省略しました
最後に
高速化などは本記事では行わなかったですが、その辺りはV2以前までと同様の手段が実行できるはずです。