TRY AND ERROR

気になったこと、勉強したこと、その他雑記など色々メモしていきます。。Sometimes these posts will be written in English.,

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