はじめに
個人開発の中で学んだことを備忘録としてまとめます。
※間違いがありましたらご教授お願い致します。
開発環境
Ruby on Rails7
デプロイ Render
DBサーバー Neon
前回の記事で誰でもお試しで使えるようゲストログイン機能を実装し、メインの機能が一区切りしたため、本番環境へデプロイしたところゲストログインができなくなってしまいました。
RenderのLogにはこう書かれていました。
ActiveModel::UnknownAttributeError unknown attribute 'guest' for User.
本番環境でguestカラムが存在しないのが原因のようです。
つまりdb:migrateができていない なんで
Renderは無料プランを使っていますので、その制限もあり
色々試すもうまくいかなかった話を書きますので、最終の解決方法を知りたい方は途中をすっ飛ばして解決法まとめを読んでください。
試したこと①:DockerfileのCMDにdb:migrateを追加
Dockerfileのコマンドにdb:migrateを入れればデプロイと同時にMigrationが実行されるのではないかと思い、試してみました。
CMD ["./bin/rails", "server"]
↓
CMD ["sh", "-c", "./bin/rails db:migrate && ./bin/rails server"]
結果:何も変わらず、失敗でした。
ここで一つ気がついたのは
RenderのSettingsに「DockerCommand」という項目があります。
DockerCommandに値が設定されている場合、その内容で上書きされるので、Dockerfileに書いたCMDは無視されます。
ってことはここ(DockerCommand)にdb:migrateを書けばいいってことね〜と考えました。
次に行きます。
試したこと②:Docker Commandでmigrateを実行

このbin/rails serverを
sh -c "./bin/rails db:migrate && ./bin/rails server"に変えました。
意味が通じていません。
理由は、
Docker Commandはシェルを経由せず実行されるため、&& などを含む複雑なコマンドが期待通り解釈されませんでした。
通じなかったので元に戻しました。
試したこと③:bin/render-build.sh を作成
デプロイ記事を参考に
bin/render-build.sh を作成し、
デプロイ時に実行されるスクリプトととしてdb:migrateも追加しました。
set -o errexit
bundle install
bundle exec rails assets:precompile
bundle exec rails assets:clean
bundle exec rails db:migrate
来いっ!Migrating!
…
結果:変化なし
ここで試したこと②から得た学びを思い出しました。
”DockerCommandに値が設定されている場合、その内容で上書きされる”
DockerCommandが優先されるため、アプリ側の設定が有効になっていませんでした。
というわけで最後です。
試したこと④:DockerCommandを空欄にした
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」でデプロイ



