Docker for Mac の Mutagen-based caching で Volume のパフォーマンスが劇的に改善した

2020/8/23 追記

[2.3.5.0 の Edge release で削除されてしまった模様](https://docs.docker.com/docker-for-mac/edge-release-notes/#docker-desktop-community-2350)です。
今後の統合方法を検討するということで、続報を期待します。。

----
[Docker for Mac の Edge channel](https://docs.docker.com/docker-for-mac/edge-release-notes/#docker-desktop-community-2310) で、 [Mutagen ベースのキャッシュ](https://docs.docker.com/docker-for-mac/mutagen-caching/)が使えるようになっています。(手元のバージョンは 2.3.1.0)

従来、 EC-CUBE をはじめとする Symfony をベースとしたアプリケーションや、Composer や npm などのパッケージ管理システムのファイルをマウントすると、[強烈に遅くなる問題](https://github.com/docker/for-mac/issues/2707)がありました。

今回利用できるようになった Mutagen ベースのキャッシュを利用するには、

 1. Preferences -> Resources -> FILE SHAREING でマウントするディレクトリを指定
 2. キャッシュを ON にするだけ。
 
です。
<img width="1152" alt="スクリーンショット 2020-05-24 19.54.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40662/f14083cf-275e-217f-d54a-683d41a29dbd.png">


あとは通常通り、アプリケーション全体をボリュームにマウントして大丈夫です。

```shell
## 例
docker run --name ec-cube -p "8080:80" -v "$PWD:/var/www/html:cached" --link container_mysql:db eccube-php-apache
```

以下、手元の環境での比較です。
約7倍にパフォーマンス向上しています。
(性能のよいディスク使っているので、体感的な差は少ないですが、古めの環境では大きく差が出ると思います)

**Mutagen-based caching OFF の場合**
<img width="228" alt="スクリーンショット 2020-05-24 20.24.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40662/d690e5de-db99-2fb0-9c55-2b8da6eb6337.png">

**Mutagen-based caching ON の場合**
<img width="240" alt="スクリーンショット 2020-05-24 20.21.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40662/a252f2af-89fe-527a-dc28-08642e06db02.png">


[GitHub の issues](https://github.com/docker/for-mac/issues/2707#issuecomment-631641183) にもパフォーマンス検証結果がコメントされていますので、併わせてご覧ください。

Ruby や Node.js など、 PHP 以外のアプリケーションでもパフォーマンス向上が期待できます。
Docker for Mac の遅さに手を焼いていた方はぜひお試しください！

## 2020年5月26日追記

[マウントしたファイルのパーミッションが変わってしまう問題](https://github.com/docker/for-mac/issues/4593) があります。
近いうちに改善されるかもしれませんが、 コンテナ上で `chmod -R o+w <mounted volume>` するなりして凌ぎましょう...

*こちらのツイートも参考に*

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">試した<br>1. キャッシュ処理が終わるまでコンテナ内で使えない<br>2. 使わないときよりCPU消費してる気がする<br>3. owner/group/permissionが変わる。問題は報告されていて改善するかも？ <a href="https://t.co/TGiY5wqkaU">https://t.co/TGiY5wqkaU</a></p>&mdash; Koji Tanaka (@tenkoma) <a href="https://twitter.com/tenkoma/status/1264125904256528384?ref_src=twsrc%5Etfw">May 23, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Some nice performance work on <a href="https://twitter.com/Docker?ref_src=twsrc%5Etfw">@Docker</a> Desktop for Mac, please help test it if you can. Shockingly good performance on some things (like <a href="https://twitter.com/hashtag/ddev?src=hash&amp;ref_src=twsrc%5Etfw">#ddev</a> composer install). Testing instructions and comparisons at <a href="https://t.co/TlJC0JsoCN">https://t.co/TlJC0JsoCN</a> <a href="https://t.co/gifRftpk6d">pic.twitter.com/gifRftpk6d</a></p>&mdash; Randy Fay (@randyfay) <a href="https://twitter.com/randyfay/status/1265435297476571136?ref_src=twsrc%5Etfw">May 27, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>