はじめに
今回はDockerでの開発環境を整えるため、
- rails newの実行
- Rails APIとして使うためのDockerfileの作成
を行いました。
今回私は、最初にDockerfileの作成→rails new実行という順序で行ってしまったのですが、Githubのリモートをローカルに追加する際、Dockerfileが上書きされてしまったので、rails new実行→好みのDockerfileのに編集、という流れが1番自然だと気づきました。
今回は、その自然な順序でまとめていきたいと思います。
Dockerイメージの作成
早速rails newを実行したいところだが、その前にDockerを作成する。
rails newはどこで実行するかによって結果が全く変わるので、用途によって正しい順番がある。
今回はdocker環境での実装なので、docker内でrails newを実施するのが正しい。
詳しい理由
- 理由1: Railsが生成する環境がLinux向けになる
Docker は「Linux の機能(namespaces / cgroups)」を使ってコンテナを作っている。 - 理由2:bundle install も Docker 内(Linux)で行われる
ローカルでrails newをすると、ローカルでもDocker内でもbundle installをしなければいけなくなる。 - 理由3:Dockerfile の文脈で rails new ができる
ローカルで生成してしまうとDockerと整合しないファイルが生成されてしまう。 - 理由4:本番環境(AWS ECS / Render / Railway)と同じ OS で動作する
ローカルと本番環境での差異が消える。
なのでまずはDockerをたちあげる。
docker-compose build
rails newを実施
1. rails newとは
rails newとは、Railsアプリの雛形を作成してくれるもの。ローカルマシンにRubyやRailsの環境がなくても、簡単に新しいRailsプロジェクトの雛形を作成できる。
rails new実行時にオプションをつけると色々な指定をした状態でアプリのひな形を生成することがでる。
*オプション一覧はこちら↓
今回のオプション
-
-api
API専用モードで Rails を作るオプション
通常の Rails は、
・views(HTMLテンプレート)
・assets(CSS/JS)
・helpers
・middleware
などが全部揃った “フルスタック” Railsだが、今回は React をフロントに使うので、Rails は API として動くだけで十分。
-apiをつけると:
・余計な HTML 構造が一切不要になる
・コントローラが API 向けに軽量化される
・ミドルウェアが減って高速化
・APIとしての開発が超シンプル -
d postgresql
データベースを PostgreSQL にする
rails newのデフォルトは sqlite3 となるが、今回はPostgreSQLに設定。
d postgresqlをすることで、PostgreSQL 用の database.yml が生成される。 -
-force
既存ファイルを “上書き” するオプション
2. rails newを実施
これらのオプション付きrails newをdocker内で実行。
docker-compose run --rm api rails new . --api -d postgresql --force
Dockerfileの編集
今回は本番用ではなく、開発用にシンプルなDockerfileを作成。
FROM ruby:3.2
RUN apt-get update -qq && apt-get install -y \
build-essential \
libpq-dev \
curl
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
RUN apt-get install -y nodejs
RUN corepack enable
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
COPY . /app
全てを理解できるわけではないが、できる限りフォローアップ。
1. FROM ruby:3.2
Docker で使う OS + 言語環境の元イメージ。
これは Debian Linux + Ruby が入った公式イメージ。
2. Debian Linux のパッケージをインストール
RUN apt-get update -qq && apt-get install -y \
build-essential \
libpq-dev \
curl
この3つはRails開発に必須
- build-essential
C言語のコンパイラ。
Rails の gem の多くは内部で C をコンパイルするので必要。 - libpq-dev
PostgreSQL と接続するためのライブラリ。
AWS RDS(PostgreSQL)と Rails を接続するのに必須。 - curl
Node.js のセットアップで使う。
3. Node.js のセットアップ
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
RUN apt-get install -y nodejs
Rails 7 は JS をほぼ使わない API モードでも、内部で Node.js が必要になる場面がある。
今回はReactと接続する予定なので、Nodeが必須。
4. corepack enable
RUN corepack enable
corepack は npm / yarn の管理ツール。これにより Yarn が使えるようになる。
5. Rails を置くディレクトリ設定
WORKDIR /app
Docker の中で Rails のプロジェクトを /app に置く標準的な設定。
6. Gemfile と Gemfile.lock をコピー
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
Gemfile が変わらない限り、bundle install を再実行しなくて済む。
7. bundle install(Rails の gem 全部インストール)
RUN bundle install
Rails や依存ライブラリが Docker 内に入る。
8. プロジェクト全体をコピー
COPY . /app
ここで初めて Rails のコード全体を Docker に入れる。
イメージの再ビルド、立ち上げ
Dockerfile を変更したら必ず再ビルドが必要。
docker-compose build --no-cache
Dockerfile は「イメージを作る設計図」。中身を変えたら 設計図に合わせてイメージを作り直す必要がある。
--no-cacheをつけたのは、Rails new が Dockerfile を上書きしていたせいで
古いキャッシュが残っていると不具合が出る可能性があったため。
再ビルトができたら、立ち上げる。
docker-compose up
すると、Rails が起動して localhost:3000 にアクセスできる。
アクセスするとDB設定がまだローカル向けでエラーが出ているが、今回はここまで。
終わりに
今回学んだこと
- rails newを実施するタイミング
- Dockerfileの中身の意味