1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Rails × Render × Docker】本番環境でdb:migrateが実行されない!解決までの記録

1
Last updated at Posted at 2026-02-23

はじめに

個人開発の中で学んだことを備忘録としてまとめます。
※間違いがありましたらご教授お願い致します。

開発環境

Ruby on Rails7
デプロイ Render
DBサーバー Neon

前回の記事で誰でもお試しで使えるようゲストログイン機能を実装し、メインの機能が一区切りしたため、本番環境へデプロイしたところゲストログインができなくなってしまいました。

Image from Gyazo

RenderのLogにはこう書かれていました。
ActiveModel::UnknownAttributeError unknown attribute 'guest' for User.

本番環境でguestカラムが存在しないのが原因のようです。
つまりdb:migrateができていない なんで

Renderは無料プランを使っていますので、その制限もあり
色々試すもうまくいかなかった話を書きますので、最終の解決方法を知りたい方は途中をすっ飛ばして解決法まとめを読んでください。

試したこと①:DockerfileのCMDにdb:migrateを追加

Dockerfileのコマンドにdb:migrateを入れればデプロイと同時にMigrationが実行されるのではないかと思い、試してみました。

dockerfile
CMD ["./bin/rails", "server"]

↓

dockerfile
CMD ["sh", "-c", "./bin/rails db:migrate && ./bin/rails server"]

結果:何も変わらず、失敗でした。

ここで一つ気がついたのは
RenderのSettingsに「DockerCommand」という項目があります。
DockerCommandに値が設定されている場合、その内容で上書きされるので、Dockerfileに書いたCMDは無視されます。

ってことはここ(DockerCommand)にdb:migrateを書けばいいってことね〜と考えました。
次に行きます。

試したこと②:Docker Commandでmigrateを実行

Image from Gyazo
このbin/rails serverを
sh -c "./bin/rails db:migrate && ./bin/rails server"に変えました。

結果はこんな感じで
Image from Gyazo

意味が通じていません。

理由は、
Docker Commandはシェルを経由せず実行されるため、&& などを含む複雑なコマンドが期待通り解釈されませんでした。

通じなかったので元に戻しました。

試したこと③:bin/render-build.sh を作成

デプロイ記事を参考に
bin/render-build.sh を作成し、
デプロイ時に実行されるスクリプトととしてdb:migrateも追加しました。

bin/render-build.sh
set -o errexit

bundle install
bundle exec rails assets:precompile
bundle exec rails assets:clean
bundle exec rails db:migrate

来いっ!Migrating!
…
結果:変化なし

ここで試したこと②から得た学びを思い出しました。

”DockerCommandに値が設定されている場合、その内容で上書きされる”

DockerCommandが優先されるため、アプリ側の設定が有効になっていませんでした。

というわけで最後です。

試したこと④:DockerCommandを空欄にした

Image from Gyazo

結果:
Image from Gyazo

Migratingできました!!
guestカラムが追加され、ページ遷移もできるようになりました。

解決法まとめ

Render の設定項目のDockerCommandを空にし、
アプリ側のbin/render-build.shでデプロイ時にDB:migrateを実行するよう指示する

学び

Render設定項目のDockerCommandに書かれた内容がアプリ側に書いた内容よりも優先される

補足

最初からDockerCommandを空欄にしていたら、
DockerfileのCMDを読み取ってくれていたのではないかと思いました。

DockerfileのCMDはコンテナ起動時に毎回実行されます。
対してbin/render-build.shではデプロイ時に実行されます。
小規模アプリではどちらでも問題ありませんが、本番運用としては「デプロイ時に一度だけmigrateする」方が自然だと感じました。


参考記事
【誰でも簡単】RailsアプリをRender.comでデプロイする手順まとめ
「ローカル環境 × Rails × Render」でデプロイ

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?