Mutagen ベースのキャッシュ¶
Docker Desktop for Mac の Edge 版には、新しいファイル共有機能があります。これは Mutagen を使い、ホストとコンテナ間において、双方向の継続的な同期を処理します。この機能は次のようなアプリケーション開発において理想的です:
- ソースコードツリーが非常に大きい場合
- Mac 上でソースを編集する場合
- ソースコードをコンパイルし、Linux コンテナ内とで相互に実行する場合
このページでは、ホストとコンテナ感でファイルを同期するために、どのようにして Mutagen 機能を使うのかを説明します。また、パフォーマンスを最大化するための、いくつかのベストプラクティスも提供します。
重要
キャッシュプロセス(caching process)を完了したあとで、キャッシュしたディレクトリを使うには、あらゆるコンテナの削除と再作成が必須です。
シンプルな React アプリ¶
以下の例で扱うのは、シンプルな npx
を使うReact アプリで、Docker Desktop でソースコードをホストと開発コンテナ間で共有するように設定しています。
まず、アプリに含むためのディレクトリを作成します:
$ mkdir ~/workspace/my-app
次に、Docker Desktop で双方向のファイル同期機能(two-way file sync)を有効化します。
- Docker Desktop メニューから、 Preferences > Resources > File sharing をクリックします。
- 一覧の下で新しいディレクトリ名を入力し、エンターキーを押します。
- ディレクトリ名の横にあるトグルをクリックする。
- 設定を有効化するために Apply & Restart をクリックする。
Docker Desktop を再起動すると、 File sharing ページはこのようになります:
<図>
以下のコマンドを実行してコンテナを起動し、 npx
を含むアプリケーションのコンテナを開始します。
$ docker run -it -v ~/workspace/my-app:/my-app -w /my-app -p 3000:3000 node:lts bash
root@95441305251a:/my-app# npx create-react-app app
root@95441305251a:/my-app# cd app
root@95441305251a:/my-app# npm start
開発用のウェブサーバが起動すると、ウェブブラウザで https://localhost:3000 を開き、アプリケーションが動いているかどうか確認します。
ユーザーインターフェースの File sharing ページに戻り、ディレクトリ名の隣に cache toggle のステータスが表示されます。このステータスはファイル変更を検出すると変わり、その後にホストとコンテナ間で同期します。
文字列が Ready になるまで待ったのち、ホスト上の IDE でソースコードを開きます。ファイル src/App.js
を編集し、変更を保存した後、ウェブサーバ上から変わったかどうかを確認します。
ホスト上のコードを編集したため、変更が検出され、テスト用のコンテナに転送されます。コンテナ内の変更が検出されれば(たとえば、ビルド成果物の生成)、ホスト側に送り返します。
サブディレクトリの同期を防止¶
双方向のファイル同期は、大部分の種類のファイルにとって便利です。しかし、ログからのデバッグなど、ホスト上でのコピーが不要なデータを生成するようなコンテナもあります。
プロジェクト上で、ホスト側と継続的に同期する必要がないサブディレクトリがある場合は、同期を回避する名前付き Docker ボリュームを使います。
まず、使用するボリュームを作成します:
$ docker volume create donotsyncme
donotsyncme
同期をしたくないサブディレクトリのために、ボリュームを使います:
$ docker run -it -v ~/workspace/my-app:/my-app -v donotsyncme:/my-app/dontsyncme -w /my-app -p 3000:3000 node:lts bash
Docker Desktop はホスト上の :code:/my-app
にアプリケーションによって変更された書き込みを、すべて同期しようとします。しかし、 名前付きボリューム /my-app/donotsyncme
に書き込まれた変更処理は除外します。
ベストプラクティス¶
双方向ファイル同期を有効にするにあたり、最大のパフォーマンスを発揮するには:
- 無駄なディスク容量と CPU を避けるため、同期するディレクトリは最小化する。たとえば、
~/my-app
のようなプロジェクトのディレクトを同期するべきであり、/Users
や/Volumes
のような大きなディレクトリは絶対に同期しない。各ファイルはコンテナ内にコピーされるのを忘れないでください。つまり、Docker.qcow2
またはDocker.raw
ファイル内に収まる必要があります。 - 同期したいディレクトリは、それぞれ
docker run -v
やdocker-compose.yml
で指定します。そして、各ディレクトリないし親ディレクトリ、親の親ディレクトリが Preferences > Resources > File sharing の一覧にあるかどうか確認します。 特に、File sharing ページ上に子ディレクトリしかない場合、docker run -v
全体で双方向同期が回避され、遅くなります。 - ホストとコンテナの両方で同じファイルを編集するのを避けます。両方で変更が検出されると、ホスト側が優先され、変更によってコンテナ側は破棄されます。
- キャッシュ・プロセスの動作後は、キャッシュしたディレクトリを再利用するには、コンテナの削除・再作成が必須です。
フィードバック¶
皆さんのフィードバックは私たちにとり非常に重要です。 Docker Desktop for Mac GitHub レポジトリで、 Mutagen ラベルを付けた issue を作成してください。
参考
- Mutagen-based caching
- https://docs.docker.com/docker-for-mac/mutagen-caching/