Docker for Macで開発するときのhost-container間の同期遅い問題に対するベストプラクティス(暫定)
Docker for Macでdockerつかって開発するときにhost(Mac)のディレクトリをcontainerと共有し、hostでのソース変更をcontainer側で検知してホットリロード、、、とかやってます。hostでソースをいじる理由としては、各サービスのソース(たとえばbackend, frontendなど)をhost側のエディタ環境で一元編集したいからです。コンテナ内部にvim環境作りたくない。。。
ただこれをディレクトリマウントなどでやろうとすると、結構有名なディレクトリの同期が遅い問題が発生します。
同期を高速化する施策としてdocker-syncの導入や、volumeマウント時のcached、delegatedオプションの利用を試してきましたがいまいちでした。
# docker-sync
結構長いことこれを利用してきました。速度的にはよかったんですが、動作が結構不安定なのとcpu使用率が跳ねるので脱却。
# cached、delegated
結構よさげだったが後述のmutagenの方がよかったので却下。
現状一番いいのがMutagenってやつです。
github.com
docker-compose.ymlにvolumeマウントとmutagenの設定を書いて、mutagenコマンドで起動するだけです。
mutagen-compose.ymlなどとしてmutagen使う時はそちらで起動するようにしています。
$ mutagen compose -f mutagen-compose.yml up
version: '3' services: db: image: 'mysql:5.7' environment: MYSQL_ROOT_PASSWORD: '12345678abc' MYSQL_DATABASE: 'app' MYSQL_USER: 'app' MYSQL_PASSWORD: '12345678abc' TZ: 'Asia/Tokyo' volumes: - ./db/sqls:/docker-entrypoint-initdb.d ports: - 3306:3306 phpmyadmin: image: 'phpmyadmin/phpmyadmin' environment: - PMA_HOSTS=db - PMA_USER=root - PMA_PASSWORD=12345678abc ports: - 20000:80 backend: tty: true build: ./backend/ ports: - 20001:3000 volumes: - ./backend/app:/app frontend: tty: true build: ./frontend/ ports: - 20002:3000 volumes: - frontend:/app volumes: frontend: x-mutagen: sync: defaults: ignore: vcs: true frontend: alpha: "./frontend/app" beta: "volume://frontend" mode: "two-way-resolved" ignore: paths: configurationBeta: permissions: defaultFileMode: 0666 defaultDirectoryMode: 0777
mutagenはHomebrew一発で入ります。
$ brew install mutagen-io/mutagen/mutagen
なんか他にいい案あったら教えてほしいです。。。
Mutagenについてはこちらのサイトに詳しく書かれているのでかなり参考になると思います
Mutagenを使って開発環境の重たいDockerを3倍高速化する | GRIPHONE ENGINEER'S BLOG