前提
- docker-compose を使用していること。
※composeを使用していなくてもdockerコマンドでsyncできます・・・
- 開発環境のみで実施。
何ができる?
ファイル同期ができる。
- 片方向(rsync)
[ホスト] -> [コンテナ]
- 双方向(unison)
[ホスト] <-> [コンテナ]
なぜやるの?
開発環境でDockerを使用しているが、ソースコードをマウントさせているため、
パフォーマンスが著しく悪い。
※特にRailsプロジェクト
[参考]
File access in mounted volumes extremely slow
なのでコンテナ内に直接ソースコードを同期させて置きたい。
どうやるの?
Step1
必要なパッケージのインストール
$ gem install docker-sync
$ brew install fswatch
$ brew install unison
Step2
docker-sync.ymlを作る
[unisonを使用する場合]
version: '2'
syncs:
hoge-sync:
src: '/Users/www/'
同期されるホストの元ファイルディレクトリを指定してあげる。
※unisonがデフォルトなので明示的指定はしていない。
[rsyncを使用する場合]
version: '2'
syncs:
hoge-sync:
src: '/Users/www/'
sync_host_port: 10871
sync_host_ip: '127.0.0.1'
sync_strategy: 'rsync'
sync_userid: '501'
watch_strategy: 'fswatch'
Step3
〜 さようならマウント 〜
docker-compose.ymlの記述をちょっと変えてあげるだけ。
volumes:
- /Users/www:/var/www
↓
volumes:
- "hoge-sync:/var/www:rw"
末尾に以下を追加
volumes:
hoge-sync:
external: true
Step4
これで起動する!
どちらも同じなのでお好みで・・・
[Pattern1]
$ docker-sync start
$ docker-compose up -d
[Pattern2]
$ docker-sync-stack start
番外編
docker-composeを使用していなくてもdocker-syncだけで使えることに気づいた。
「docker run -v /User/www:/var/www」などで実行している場合、
「docker run -v hoge-sync:/var/www:rw」とするといけました。
追記
docker-sync.ymlに転送先のユーザ指定をするとさらに捗るかも!
sync_userid: '1234'