はじめに
Docker for Mac を使っていると、大量にファイルが更新された際に、同期に時間が非常にかかることがあると思います。そこで、 docker-sync を使って同期を高速化する方法を紹介します。
docker-syncの導入
OSXの場合は、非常に簡単にセットアップすることができます。まず、下記のコマンドで docker-sync をインストールします。
1 | $ gem install docker-sync |
次に、 .zshrc(もしくは.bashrc)に下記の設定を追加します。
1 2 3 | if which ruby >/dev/null && which gem >/dev/null; then PATH="$(ruby -r rubygems -e 'puts Gem.user_dir')/bin:$PATH" fi |
設定ファイルの作成
docker-sync で使用する設定ファイルは下記のとおりです。
- docker-composer.yml
- docker-composer-dev.yml
- docker-sync.yml
- .env(任意)
docker-composer.yml
docker-composer.yml は、特別な設定は不要です。本番環境で実行するときと同じようにしてください。
1 2 3 4 5 6 7 8 9 10 | version: "3" services: hogeapp: build: context: . dockerfile: Dockerfile-hoge.local fugaapp: build: context: . dockerfile: Dockerfile-fuga.local |
docker-compose-dev.yml
docker-composer-dev.yml は、ボリュームとマウントのオーバーライドを定義します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | version: "3" services: hogeapp: volumes: - hogeapp-sync:/var/www/hoge:nocopy fugaapp: volumes: - fugaapp-sync:/var/www/fuga:nocopy volumes: hogeapp-sync: external: true fugaapp-sync: external: true |
注意点として、必ず nocopy をつけるようにしてください(イメージのビルド中の内容とマージされてしまうため)
docker-sync.yml
docker-sync.yml は、同期に関する設定を定義します。
1 2 3 4 5 6 | version: "2" syncs: hogeapp-sync: src: './app/hoge' fugaapp-sync: src: './app/fuga' |
docker-sync.yml で設定できる項目については、後述します。また、こちらにサンプルがあります。
.env
バージョン0.2.0から環境変数がサポートされるようになりました。この環境変数は、 docker-composer.yml と同様に動作します。
デフォルトのファイルは .env ですが、
DOCKER_SYNC_ENV_FILE
で変更することができます。
docker-syncを実行
docker-sync は
docker-sync-stack start
で実行します(他にも実行するためのコマンドがありますが、これだけで事足りると思います)
このコマンドを実行すると、同期サービスが起動し、その後、
docker-compose up
のようなコンパイルスタックが起動します。
なお、 docker-sync.yml を変更した場合は、必ず
docker-sync clean
を実行してから、
docker-sync-stack start
を実行してください。
よく使う設定項目
docker-sync.yml で、よく使われるであろう設定項目をいくつか紹介します。
src
この項目は必須で、どのフォルダから同期するかを指定します。パスが / で終わっている場合、フォルダの内部のみが同期されます。そうでない場合は、親フォルダがトップレベルフォルダとして同期されます。
1 | src: './app' |
sync_strategy
同期方法を指定します。設定できる値は下記の通りです。詳細については後述します。
なお、macOSの場合はデフォルトで native_osx が設定されています。
- native_osx
- unison
- rsync
- native_linux
1 | sync_strategy: 'native_osx' |
sync_excludes
除外されるパターンのリストです。 sync_excludes_type で形式が変わります。
1 | sync_excludes: ['package.json', 'node_modules', '*.css'] |
または、
1 2 3 4 | sync_excludes: - 'package.json' - 'node_modules' - '*.css' |
sync_excludes_type
設定できる値は下記のとおりです。なお、デフォルトは Name です。
- Name
- Path
- Regex
- none
1 | sync_excludes_type: 'Name' |
Name は、ファイル、または、ディレクトリ名を指定します。
None は、 sync_excludes で個別に設定します。
1 | sync_excludes: ['Name hoge.txt', 'Path public'] |
同期方法
同期方法としては下記を選択できます。
- native_osx
- unison
- rsync
- native_linux
maxOS の場合、デフォルトで native_osx が選ばれます。それぞれの特徴について簡単に説明します。なお、native_linux については、選ぶ機会がないとおもいますので、割愛します。(詳しく知りたい方は、こちらをご覧ください)
native_osx
native_osx は、 OSXFS と Unison を併用します。ホストと host_sync 間の同期は OSXFS で行われ、 host_sync と app_sync の同期は Unison で行われます。これにより、 macOS 上での Unison のパフォーマンスの問題を改善しています。
unison
unison は macOS のほか、 Windows や Linux でも使用できます。Docker for Mac で使う場合は、 native_osx で良いでしょう。
rsync
rsync は非常に効率的に動作しますが、ホスト上のコードベースの変更のみがアプリコンテナに転送されます。そのため、アプリコンテナ上の変更はホストには同期されません。
さいごに
docker を高速化するための方法として、 docker-sync の使い方を紹介しました。同期の高速化については、他にも Mutagen ベースのキャッシュを使う方法もあり、こちらは Docker for Mac の設定を変更するだけ使えます(2.3.1.0以上)。機会があればこちらも試してみたいと思います。