JavaScript
Node
docker
docker-compose

DockerでVolumeをマウントするとき一部を除外する方法

例えば次のようなディレクトリ構成のプロジェクトで、node_modulesだけ除外しつつその他はすべてDockerコンテナにマウントしたいといった場合を想定する。

.
├── docker-compose.yml
├── node_modules … ここだけDockerコンテナに置きたくない
├── package.json
├── src
└── yarn.lock

まず、普通にマウントするdocker-compose.ymlを書く。この状態では当然node_modulesもマウントされる。

docker-compose.yml
services:
  app:
    image: node
    volumes:
      - .:/app

次に、適当な名前のボリュームを作る。

docker-compose.yml
+volumes:
+ hoge:
services:
  app:
    image: node
    volumes:
      - .:/app

最後に、/app/node_modulesにそのボリュームをマウントするようにする。

docker-compose.yml
volumes:
  hoge:
services:
  app:
    image: node
    volumes:
      - .:/app
+     - hoge:/app/node_modules

これでホストマシン側のnode_modulesとコンテナのnode_modulesの中は同期されなくなる。