7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DockerでRails環境を構築する(Compose V2対応)

Last updated at Posted at 2022-08-11

なんで書いたか

DockerでRails環境を構築する記事のほとんどが(更新日が新しかったとしても)Compose V2に対応していないものとなっており、見た人がそれを再生産しまくっているせいで誰もCompose V2に対応した書き方をしてくれないため。

一応今は動くけど、非推奨になってるものもあるので早めに新しい書き方に移行しようという話です。

既存のRailsアプリをDocker化する時

Dockerfile
# 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"]
compose.yml
services:
  app:
    build: .
    volumes:
      - .:/app
    ports:
     - 3000:3000
entrypoint.sh
#!/bin/bash
set -e
rm -f /app/tmp/pids/server.pid
exec "$@"

これの3つをプロジェクトルートに置いて

docker compose up

で起動します。なんらかの理由で再ビルドしたい場合にはdocker compose up --buildを実行します。

新規Railsアプリ作成時

Dockerfileを一部コメントアウトしておきます。compose.ymlはそのままで。

Dockerfile
# 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 builddocker compose up時に自動で実行されるので記述していません
  • docker compose up -dで起動する派が多かったですが、ログが直に見えた方が初学者にとって分かりやすいと思い、-dは省略しました

最後に

高速化などは本記事では行わなかったですが、その辺りはV2以前までと同様の手段が実行できるはずです。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?