Docker for Mac で遅いファイルマウントを何とかする

More than 1 year has passed since last update.


前提


  • 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'