OSXでWebアプリケーションを開発する上でDocker on Macは非常に便利ではあるのだが、ファイルシステムの関係上、 多数のファイルをマウントし書き換えが高頻度で発生するような用途では動作が非常に重くなってしまう。
(僕の場合だと最近はWebpackのdev-serverによるライブロードを使ったフロントエンド開発をやってるんだけど、これがファイル数が増えるにしたがって激烈に重くなってきたのだ・・・)
そこでファイル転送によって擬似的にマウントしているかのような動作を実現し、 動作速度の低下を回避するツールがdocker-syncである。
導入
Ruby製らしいのでgem install
$ sudo gem install docker-sync
内部で使うらしいコマンドを諸々用意
brew install fswatch brew install rsync brew install unison curl "https://raw.githubusercontent.com/hnsl/unox/master/unox.py" -o "/usr/local/bin/unison-fsmonitor" && chmod +x /usr/local/bin/unison-fsmonitor
設定
docker-compose本体
ひとまずcentos7を立ち上げるだけのものを想定
# docker-compose.yml version: "2" services: main: image: centos:7
docker-syncの設定
# docker-sync.yml version: "2" syncs: sync-volume: # ボリューム名(任意の名前をつける) src: ./mount_dir/ # ホスト側のディレクトリ(中身から同期させたい場合は最後の/を忘れずに) dest: /container_dir # コンテナ側のパス sync_host_port: 10871 # 同期に使用するホスト側のポート(かぶらなければなんでも良い) sync_strategy: rsync # 同期手法(ひとまずホスト→コンテナの一方通行で構わないのでrsyncで。双方向が必要ならunison)
docker-syncを用いるためのdocker-composeの上書き設定
# docker-compose.override.yml version: "2" volumes: sync-volume: external: true services: main: volumes: - sync-volume:/container_dir
その他
テスト用にディレクトリ切ってファイルを用意
$ ls ./mount_dir/ test.txt $ cat ./mount_dir/test.txt test
使い方
起動
ファイル同期のためのタスクをスタート
$ docker-sync start --daemon
実際にdocker-composeで確認すると・・・
$ docker-compose run --rm main ls /container_dir test.txt $ docker-compose run --rm main cat /container_dir/test.txt test
マウントされていることが確認できる。
ホストからの書き込みへの追従
$ docker-compose run --rm main watch cat /container_dir/test.txt
とやった上で別窓で
$ echo hogehoge >> ./mount_dir/test.txt
でひとまずホスト側のファイルに追従していることは確認できる。
後片付け
$ docker-sync list $ docker-sync stop $ docker-sync clean
補足
ちなみに状況によってはコンテナ内に配置するファイルのユーザを固定したい場合もある。
sync_strategy: unison
であればsync_user_id
としてファイルに付加されるユーザIDを指定することができる。
また、docker_sync_stack start
コマンドによりdocker-composeも同時に起動させることもできる。
プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化
- 作者: WINGSプロジェクト阿佐志保
- 出版社/メーカー: 翔泳社
- 発売日: 2015/11/19
- メディア: Kindle版
- この商品を含むブログ (3件) を見る
追記
今ダウンロードできる最新のDocker for Mac v17.06ではマウントの速度が大分改善されている雰囲気なので、docker-syncももう不要かもしれない。
やっぱり最初の設定が面倒なのと、意図せずvolumeが残ったりして運用に落とし穴があったするわけで、使わないで済むならそれに越したことはない。