😁

【Docker CE/Rails】ソースコードの変更が反映されない

2023/12/22に公開

https://zenn.dev/junki555/articles/7e98b108148ad4 とほとんど同じ内容です
Docker CE + Rails 環境で開発をしています。ソースコードの変更が自動で反映されていたのですが、反映されなくなることがあったので、自分の環境での解決策を備忘録として残します。

要約

  • ランチから戻ってきたら hwclock コマンドか WSL を再起動して時刻を更新しよう

環境

  • Docker CE/WSL
  • Ubuntu 22.04.3
  • Ruby 3.1.2
  • Rails 7.1.2

自動反映の設定

調べたかぎり、以下のように設定をおこなうことで、ソースコードの変更が自動で反映されるようになるそうです

config/environments/development.rb の設定を変更する

config/environments/development.rbconfig.file_watcherActiveSupport::FileUpdateChecker に変更することで、ファイルの変更が監視されるようになります
ただし、config.reload_classes_only_on_changetrue の場合(デフォルトでは true)のみ有効な設定で、なお、config.reload_classes_only_on_changeconfig.cache_classestrue の場合(develop の場合デフォルトは false)は無視されます

Rails ガイドによると config.reload_classes_only_on_change はデフォルトで trueconfig.file_watcher は、v5.1 から現行の v7 系までデフォルト値として ActiveSupport::FileUpdateChecker および ActiveSupport::EventedFileUpdateChecker が指定されており[1]、Rails7 系を利用している自分の環境では設定は必要なさそうです

こんな感じです

docker-compose.yaml に開発ディレクトリをマウントする

docker-compose.yamlvolumes にソースコードを反映させたいディレクリを指定します

----
services: 
  app:
    ----
    volumes:
      - <ディレクトリ名>:/usr/src/app # 適宜自分の環境に合わせる

ここは以前自分が設定しておりました。

WSL を再起動して解決

そもそも上記の設定が有効であることは確認していましたし、自動反映もされていました。
反映されないときがあるというのが厄介な問題でしたが以下のように、 WSL を再起動することで解決しました

docker machine よりもホスト側の方が未来の時刻になっているとリロードしないらしい

activesupport の実装上、仮想マシンとホストマシンの時刻を比較し、ホストマシンの時刻の方が未来であると判断されると ActiveSupport::FileUpdateChecker を無効にするそうです

https://qiita.com/pocari/items/456052a291381895f8b3
https://github.com/rails/rails/blob/main/activesupport/lib/active_support/file_update_checker.rb

長時間 PC をスリープしていたりすると、たまに docker machine の時刻とホスト PC の時刻がずれることがあります
今回はこれがそもそもの原因が高そうですね
WSL を再起動して時刻のずれを矯正し、rails s すると再度自動反映されるようになりました

$ wsl --shutdown

さいごに

この問題もあるので、ランチから戻ったら WSL を再起動するようにします

間違いなどあればコメントにて教えていただけるとありがたいです
ありがとうございました

参考

config について

https://zenn.dev/junki555/articles/7e98b108148ad4
https://railsguides.jp/v7.1/configuring.html

docker-compose.yaml の設定

https://qiita.com/YUKI178504/items/7cd63d915915e8f85820
https://zenn.dev/randd/articles/84ac7de7f22800

時刻更新

https://qiita.com/pocari/items/456052a291381895f8b3
https://github.com/rails/rails/blob/main/activesupport/lib/active_support/file_update_checker.rb

脚注
  1. v5.0 以前は file_watcher のデフォルト値に関する記述を確認できませんでした ↩︎

Discussion