docker-syncがどうも効いていないと思ったら。
docker-syncについて説明している多くのウェブサイトでは、以下のようにdocker-composeを呼び出すことを推奨している。というか、公式でこう言っている。
docker-compose -f docker-compose.yml -f docker-compose-dev.yml up
version: "2"
services:
someapp:
image: alpine
container_name: 'fullexample_app'
command: ['watch', '-n1', 'cat /var/www/somefile.txt']
otherapp:
image: alpine
container_name: 'simpleexample_app'
command: ['watch', '-n1', 'cat /app/code/somefile.txt']
version: "2"
services:
someapp:
volumes:
- fullexample-sync:/var/www:nocopy # nocopy is important
otherapp:
# thats the important thing
volumes:
- simpleexample-sync:/app/code:nocopy # nocopy is important
volumes:
fullexample-sync:
external: true
simpleexample-sync:
external: true
マウントする大元のディレクトリは、docker-sync.ymlのsyncsに指定する。
syncs:
fullexample-sync:
src: '/var/www'
simpleexample-sync:
src: './app/code'
この例は確かに動く。しかしこれには穴があり、書き方次第ではちゃんと動かない場合がある。
docker-compose.yml
に同じvolumesを定義していた場合である。
複数のymlを指定した場合、volumesのオプションはオーバーライドされない。
https://github.com/EugenMayer/docker-sync/issues/479
Your issue is, that you think you can override volume defintions, but you cannot.
So ${SYMFONY_APP_PATH}:/var/www/symfony stays in charge and supersync-sync:/var/www/symfony:nocopy never gets used.
確かに上の例ではdocker-compose.ymlにはvolumesを定義していない。だが例えばdocker-compose.ymlを以下のように書いた場合、結局nativeのコピーと変わらないどころか、コンフリクトしてしまうことになる。
version: "2"
services:
someapp:
image: alpine
container_name: 'fullexample_app'
command: ['watch', '-n1', 'cat /var/www/somefile.txt']
volumes:
- /var/www:/var/www # この部分はoverrideされない
otherapp:
image: alpine
container_name: 'simpleexample_app'
command: ['watch', '-n1', 'cat /app/code/somefile.txt']
volumes:
- ./app/code:/app/code # この部分はoverrideされない
docker-compose.ymlのみの場合はdocker-syncを使わず、docker-syncを使う場合のみdocker-compose-dev.ymlを一緒に読み込むという使い方をしている人も少なくないだろう。
しかし、docker-compose.ymlにはvolumesの設定を書くべきではない。
docker-syncの使用/不使用を使い分けたい場合はvolumeのみを記述した別設定を用意し、docker-compose.ymlと一緒に呼び出してあげる必要がある。
コンテナ側マウントポイントのディレクトリが重複した場合は、ちゃんとoverrideしてくれるという報告もある。
https://github.com/docker/compose/issues/2633
しかし今回の場合はこれは適用されないのだろうか…?
nocopyを付けた場合はちゃんと動作しないのかもしれないが、よく分からない。
少なくともドキュメントに書いていないのは、ちょっと不親切と言えるかもしれない。