Rails 8 + Tailwind CSS v4 の新規アプリを Docker で構築した際に遭遇したエラーと、その解決策の記録です。
初めてRails 8で環境構築しましたが、Rails 7の Dockerfile を転用したことで、エラーが起こってしまいました。バージョンアップした際はきちんと公式ドキュメントなりを参照しなくてはいけないことを学びました…。
環境
- Ruby: 3.3
- Rails: 8.1
- PostgreSQL: 17
- Tailwind CSS: v4
1. Rails 8 のデフォルトが本番環境になっていた。
現象
bin/rails db:create 実行時に以下のエラーが発生する。
ArgumentError: Missing secret_key_base for 'production' environment
原因
Rails 8 の Dockerfile はデフォルトで以下のように設定されています。
# Dockerfile
ENV RAILS_ENV="production"
そのため、Docker 経由のコマンドは本番環境として実行され、 master.key が存在しないことでエラーになっていました。
解決策
docker-compose.yml で開発環境であることを明示しました。
# docker-compose.yml
services:
web:
environment:
RAILS_ENV: development
2. 「localhost」と「0.0.0.0」の接続拒否
現象
ログには Listening on http://127.0.0.1:3000 と出ているのに、ホスト側のブラウザからアクセスできない。
原因
コンテナ内の 127.0.0.1 はコンテナ自身(ローカルループバック)を指すアドレスです。そのため、ホスト OS からの接続を受け付けていませんでした。
補足:なぜ 0.0.0.0 が必要なのか?
Docker コンテナはホスト OS とは隔離された「別のマシン」として動作します。
127.0.0.1は「コンテナ内部からのアクセスのみ許可」という意味になるため、コンテナの外(ブラウザ)からのアクセスが遮断されてしまいます。
0.0.0.0に設定することで「外部からのアクセスも許可」するようになり、ブラウザから繋がるようになります。
解決策
サーバーを全 IP バインド(0.0.0.0)で起動するように変更します。
# Procfile.dev
web: bin/rails server -b 0.0.0.0
css: bin/rails tailwindcss:watch
※ここからは、前アプリから流用したことによる個人的な制作ミスのため、同じような状況が起こるとは限りません。
完全に備忘です。
3. ファイル編集が反映されない(マウントのズレ)
現象
ホスト側でコードを修正しても、コンテナ内の動作やログが変わらない。
原因
Dockerfile と docker-compose.yml で作業ディレクトリのパスが不一致でした。
Dockerfile: WORKDIR /lex_flow
docker-compose: volume → /rails
結果として、ホストの修正内容がコンテナの正しい場所に同期されていませんでした。
解決策
マウント先を統一します。
# docker-compose.yml
volumes:
- .:/lex_flow
- bundle_data:/lex_flow/vendor/bundle
4. マルチステージビルドのコピーミス
現象
docker compose build 実行時に以下のエラーが発生する。
COPY ... /rails: not found
原因
Build ステージから Final ステージへのファイルコピー時に、古いパス /rails のままになっていました。
解決策
COPY コマンドのパスを正しい作業ディレクトリに修正します。
# Dockerfile (Final Stage)
COPY --chown=rails:rails --from=build /lex_flow /lex_flow
5. アプリ名とディレクトリ名の衝突(補足)
※Rails 8 特有ではなく、ディレクトリ構造に依存するエラーです。
現象
docker compose run ... rails new . 実行時に以下のエラーが発生する。
Invalid application name rails
原因
Dockerfile の作業ディレクトリを以下のようにしていました。
WORKDIR /rails
rails new . を実行すると、Rails はカレントディレクトリ名からアプリ名を自動生成しようとします。
その結果 「アプリ名 = rails」 と判定されましたが、rails は予約語のためエラーとなりました。
解決策
WORKDIR を任意のアプリ名ディレクトリに変更します。
WORKDIR /lex_flow
コンテナ内確認コマンド
ファイルの中身確認
docker compose exec web cat Procfile.dev
現在の作業ディレクトリ確認
docker compose exec web pwd
学びポイント
-
Rails 8 は Docker 前提の設計に変わった(初期設定は
Production寄り) -
Dockerfile のデフォルトが
productionになっているので開発時は注意 -
Dockerのトラブルはパス不一致が非常に多いらしい -
困ったらコンテナの中を直接確認する(そんな手段があることすら知らなかった初心者…)