Docker for Macでマウントしたvolumeの遅さに対処する

結論

マウント時にdelegatedあるいはcachedオプションを付ければ、一貫性を犠牲にして速度を改善できる。

バージョン

困ったこと

Docker for Macでのvolumeマウントは非常に遅い。
ローカルにあるプロジェクトディレクトリをマウントして開発するような場合、
各種ビルドやライブラリのインストール、下手をするとWebサーバーへのアクセスすら耐えられないほど遅くなってしまう。

解決策

この問題には公式に解決策が示されており、
マウント時に特定のオプションを指定することで、一貫性は犠牲になるものの速度が劇的に改善する。

https://docs.docker.com/docker-for-mac/osxfs-caching/

詳細な解説は上記ページに譲るとして、概要だけを記しておく。

delegatedは最も信頼できないが最も速い。 コンテナで起こった書き込みがホスト側のファイルシステムに反映されるまでに遅延がありうる。 よって、書き込みがホスト側に反映される前にコンテナがクラッシュした場合、書込の内容は失われる。
書き込みの内容が失われても良いならばこれ。

cachedは中庸。 コンテナで起こった書き込みは直ちにホスト側のファイルシステムに反映される。 ただしホスト側の書き込みがコンテナに反映されるまでに遅延がありうる。 コンテナで頻繁に書き込みがないならばこちらでもかなりパフォーマンスの改善が見込める。

consistentはデフォルトの設定で、一貫性が担保される代わりに非常に遅い。

一応の参考までに、自分の関わっていたプロジェクトではconsistentからdelegatedにすることで、
WebページのTTFBが2sから300ms程度まで改善した。