Docker for macのvolume同期が遅すぎる問題

#概要

docker for macのvolume同期が遅いので、syncで早くする。 ホスト側とdockerコンテナで同期したい場合にvolumeを使うが、 反映されるのに時間がかかりすぎる問題がある。 ホスト側で変更をするたびにdockerをdown upをすれば反映されるけど遅い。 docker-sync startを叩くと少し早くなる。



============================================================
2019/8/19 きになる記事追加。
docker内のパーミッション関連。
やっぱり同期が早い時は早いし、遅い時は遅い。なんかパソコンが重い時は遅い感じがする。
パソコン買い替えの時期か？

https://stackoverflow.com/questions/48619445/permission-denied-error-using-laravel-docker
https://stackoverflow.com/questions/34031397/running-docker-on-ubuntu-mounted-host-volume-is-not-writable-from-container

============================================================


[今回のgitはこちら。](https://github.com/miyamotok0105/docker_sample/tree/master/03docker_compose_web/flask_compose_sync_sample)    


今回の経緯としては普通にdockerで開発するようになって、変更したものがdocker側で変わってなくない？って疑問が発生したことからスタートしてる。
ちょっと前は普通に早く同期されてた気がするのだけど。。。　何が変わったのか不明。



# 環境


```
Docker version 19.03.1
docker-compose version 1.24.1

ruby 2.3.7p456
gem 2.5.2.3
Homebrew 2.1.9
```

# 環境構築

gemとかbrewについては別記事を参照。

```
gem install docker-sync
brew install eugenmayer/dockersync/unox
brew install fswatch unison rsync
```

# syncする



```:Dockerfile
FROM python:3.7-alpine3.7

ADD . /my-web-app
WORKDIR /my-web-app

RUN pip install -r requirements.txt

CMD [ "python", "./app.py" ]
```



```py:app.py
from flask import Flask, jsonify

app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False

@app.route('/')
def index():
  return jsonify({
    "message": "test!!2"
  })

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=80)
```


```:requirements.txt
Flask
```


docker-compose.ymlに加えてdocker-sync.ymlも作成する。


```:docker-compose.yml
version: '2'

services:
  web:
    build: .
    working_dir: /my-web-app/
    tty: true
    ports:
      - "127.0.0.1:80:80"
    volumes:
      - web_syncs:/my-web-app/:nocopy

volumes:
  web_syncs:
    external: true
```


```:docker-sync.yml
version: '2'

syncs:
  web_syncs:
    src: './'
    sync_strategy: 'unison'
```

syncして同期スタート。
docker-compose build --no-cache webはwebと言う名前のサービスをキャッシュなしてイメージ生成してる。

docker-compose -f ./docker-compose.yml up -dでデーモンでコンテナ起動する。


```
docker-sync start
docker-compose build --no-cache web
docker-compose -f ./docker-compose.yml up -d
```

http://localhost:80

ローカル側で何か変更して同期（docker-sync start）すると値が変更される。


```py:app.py
from flask import Flask, jsonify

app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False

@app.route('/')
def index():
  return jsonify({
    "message": "test!!3" ⇦★ここを変更すると結果が変わるはず
  })

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=80)
```



コンテナ内を確認したい場合。今回のコンテナイメージはpython3.7と言う簡易的なコンテナなのでbashすら入ってないのでshを指定する。

```
docker-compose exec web sh
```

最後にキレイキレイしたい場合はdownしてvolumesも消す。コンテナ止めて、消して終了。


```
docker-compose down --volumes
docker-compose stop
docker-compose rm

docker-sync stop
```


#まとめ

使い方があってるのか不明だがdocker-syncを使ってみる記事が多いので、使って早くなった。であってるのかな？
意見などウェルカムです。



# 参考


docker-syncでホスト-コンテナ間を爆速で同期する
https://qiita.com/pocari/items/0340049742927f3a94b7
docker-sync
https://qiita.com/Satoshi_Numasawa/items/278a143aa41735e1b0da

Laravel 向け開発環境 Laradock のマウント方法によるベンチマーク結果(2018-03-31現在)
→元はlaradockで困ってた。
https://qiita.com/kunit/items/202284942aab6a89ba30

[Docker19.3について](https://medium.com/nttlabs/docker-1903-5155754ff8ac)