LoginSignup
9
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-12-03

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

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5