WSL+DockerでHot reload が動作しない

作成: 2021年02月07日

更新: 2021年02月07日

問題

WSL2+Dockerの開発環境(WSL2とDockerの導入)でexpoやcargo-watchによるHot reload機能(ソースコードを変更すると自動でリビルドする機能)が動作しないことがある

解決策

/mnt/c以下ではなく~以下などWSLのディレクトリにソースコードを置く.

Docker Desktop on WSL2: The Problem with Mixing File Systems | by Manfred Lange | Level Up Coding

上記の記事によるとファイル変更を検知するinotifyという機能がWindowsのファイルシステムとLinuxのファイルシステムでまたがっていると機能しないためHot reload機能も動作しないようです.

そのためWSL内にファイルを置けばきちんとHot reloadは動作した.

WSL内にファイルを置けない場合

巨大なファイルを扱っているなどWSL内にファイルを置けない事情がある場合はDocker内にCHOKIDAR_USEPOLLING=1またはCHOKIDAR_USEPOLLING=trueという環境変数を追加することでinotifyの代わりにChokiderという機能を使うように設定できこの場合はWSL外のファイルでもHot reloadが機能する.

ただしこれはCPU使用率などが劇的に増加する恐れがあるため推奨はされていない.

参考: [WSL2] File changes made by Windows apps on Windows filesystem don't trigger notifications for Linux apps · Issue #4739 · microsoft/WSL

他参考リンク

Running development server with create-react-app inside of a docker container - Stack Overflow

Omnisharp ignores code in newly added source files · Issue #4223 · OmniSharp/omnisharp-vscode

Mounts stop receiving inotify change events from Windows host · Issue #8479 · docker/for-win