そんな今日この頃の技術ネタ

本家側に書くほどでもない小ネタ用

Docker for Macが重くてしんどくなってきたのでdocker-syncについて調べてみた

OSXでWebアプリケーションを開発する上でDocker on Macは非常に便利ではあるのだが、ファイルシステムの関係上、 多数のファイルをマウントし書き換えが高頻度で発生するような用途では動作が非常に重くなってしまう。

(僕の場合だと最近はWebpackのdev-serverによるライブロードを使ったフロントエンド開発をやってるんだけど、これがファイル数が増えるにしたがって激烈に重くなってきたのだ・・・)

そこでファイル転送によって擬似的にマウントしているかのような動作を実現し、 動作速度の低下を回避するツールがdocker-syncである。

docker-sync by EugenMayer

github.com

導入

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教科書 インフラの基礎知識&コードによる環境構築の自動化

プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化