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