【Docker CE/Rails】ソースコードの変更が反映されない
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.rb
の config.file_watcher
を ActiveSupport::FileUpdateChecker
に変更することで、ファイルの変更が監視されるようになります
ただし、config.reload_classes_only_on_change
が true
の場合(デフォルトでは true
)のみ有効な設定で、なお、config.reload_classes_only_on_change
は config.cache_classes
が true
の場合(develop の場合デフォルトは false
)は無視されます
Rails ガイドによると config.reload_classes_only_on_change
はデフォルトで true
、config.file_watcher
は、v5.1 から現行の v7 系までデフォルト値として ActiveSupport::FileUpdateChecker
および ActiveSupport::EventedFileUpdateChecker
が指定されており[1]、Rails7 系を利用している自分の環境では設定は必要なさそうです
こんな感じです
docker-compose.yaml に開発ディレクトリをマウントする
docker-compose.yaml
の volumes
にソースコードを反映させたいディレクリを指定します
--略--
services:
app:
--略--
volumes:
- <ディレクトリ名>:/usr/src/app # 適宜自分の環境に合わせる
ここは以前自分が設定しておりました。
WSL を再起動して解決
そもそも上記の設定が有効であることは確認していましたし、自動反映もされていました。
反映されないときがあるというのが厄介な問題でしたが以下のように、 WSL を再起動することで解決しました
docker machine よりもホスト側の方が未来の時刻になっているとリロードしないらしい
activesupport
の実装上、仮想マシンとホストマシンの時刻を比較し、ホストマシンの時刻の方が未来であると判断されると ActiveSupport::FileUpdateChecker
を無効にするそうです
長時間 PC をスリープしていたりすると、たまに docker machine の時刻とホスト PC の時刻がずれることがあります
今回はこれがそもそもの原因が高そうですね
WSL を再起動して時刻のずれを矯正し、rails s
すると再度自動反映されるようになりました
$ wsl --shutdown
さいごに
この問題もあるので、ランチから戻ったら WSL を再起動するようにします
間違いなどあればコメントにて教えていただけるとありがたいです
ありがとうございました
参考
config について
docker-compose.yaml の設定
時刻更新
-
v5.0 以前は file_watcher のデフォルト値に関する記述を確認できませんでした ↩︎
Discussion