docker
docker-sync

docker-syncが効かないのはOverrideが原因かも

More than 1 year has passed since last update.

docker-syncがどうも効いていないと思ったら。

docker-syncについて説明している多くのウェブサイトでは、以下のようにdocker-composeを呼び出すことを推奨している。というか、公式でこう言っている。

docker-compose -f docker-compose.yml -f docker-compose-dev.yml up
docker-compose.yml
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']
docker-compose-dev.yml
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に指定する。

docker-sync.yml
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のコピーと変わらないどころか、コンフリクトしてしまうことになる。

docker-compose.yml
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を付けた場合はちゃんと動作しないのかもしれないが、よく分からない。
少なくともドキュメントに書いていないのは、ちょっと不親切と言えるかもしれない。