Docker化したRailsアプリを開発中、ビューファイル(.html.erb)のソースコードを変更して開発環境のlocalhostをリロードしても変更が反映されない不具合に遭遇しました。docker-compose.yml
でホストのディレクトリをコンテナにマウントしているため、それまではソースコードの変更はブラウザをリロードすると反映されていたのですが、急に反映されなくなりました。docker compose down
で一旦コンテナを落としてからdocker compose up
をすれば反映されるのですが、ソースコード変更の度にそれをやるのは効率が悪すぎるため、解決方法を調べ、自分が実際に上手くいった方法をまとめました。
環境は以下のとおりです。
- OS:IntelMac
- Docker
- docker-compose
- Rails7.0.6
- PostgreSQL
docker-compose.yml
version: '3'
services:
web:
build: .
image: rails_template:latest
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
設定を追記
config/environments/development.rb
を下記のようにします。
config/environments/development.rb
config.cache_classes = false
# 以下の設定はデフォルトでは記載なしの可能性もあり
- config.file_watcher = ActiveSupport::EventedFileUpdateChecker
+ config.reload_classes_only_on_change = true
+ config.file_watcher = ActiveSupport::FileUpdateChecker
いろんな記事を見ていると「デフォルトでEventedFileUpdateChecker
になっているからFileUpdateChecker
に変えればよい」と書かれているのですが、自分の環境ではこの行が最初からなかったので、その場合下2つを追記すればいいと思います。
- 参考記事1によると、
config.cache_classes = false
かつconfig.reload_classes_only_on_change = true
の場合、config.file_watcher
がenableになるようです。また、「ActiveSupport::FileUpdateChecker
およびActiveSupport::EventedFileUpdateChecker
が指定されており、Rails7 系を利用している自分の環境では設定は必要なさそう」とあり、そもそも必要ない可能性もあるようです。 - 参考記事2ではRails6を使用していますが、
config.reload_classes_only_on_change = true
の設定はしておらず、結局何が正解かはわからないです。
PCを再起動
使っているPCを再起動しましょう。最初は上記の追記をやってコンテナを再度立ち上げても解消されませんでしたが、Macを再起動するときちんと反映されるようになりました。
- 参考記事1や参考記事3にあるように、Dockerとホストで時間がずれていると、先程の追記だけでは解消されないようです。自分の場合、今回のエラーに遭遇するまでおそらく1週間以上はずっとMacの再起動やシャットダウンはしてなかったので、時間のずれが生じていた可能性があります。
参考記事
- 【Docker CE/Rails】ソースコードの変更が反映されない
- Docker + Rails6環境でコード即時反映されない件 - yposiのブログ
- dockerでrails5環境構築 #Ruby - Qiita
- 【Rails】Viewファイルの変更がページのリロードで反映されないときの対処法|Dockerのコンテナを再起動は不要(ビューファイル .html.erb)
- 【Rails6】Dockerコンテナを再起動しないとソースコードが反映されない #Rails - Qiita
- dockerにて、編集がローカルで反映されない
- railsでテンプレートがないと怒られる
- Vagrant + Rails 6.0.2.1 のdevelopmentでコード変更が反映されない現象を解決 - Just do IT
- Docker + Rails で開発していてソースコードが即時反映されない時のたったひとつのcoolな答え