docker と使っているとdocker composeもよく使います。
プロジェクトを開始するときは、まずdocker-compose.ymlを作成するところから始めるぐらいです。
今回は、ボリュームマウントをする際に特定のサブディレクトリや特定のファイルをマウントの対象から除外する方法を書き溜めます。
ホスト側のファイルを使うのではなく、コンテナ側のファイルやディレクトリを残しておく方法です。
例えば、NodeJsならnode_modulesはコンテナの中だけに入れて置き、ホスト側で触ったりすることはないと思います。しかし、作業ルートディレクトリをマウントさせたい。ってことは多いと思います。
先に結論:ファイルなら/dev/null, ディレクトリなら匿名ボリュームを使う
ファイルはソース側の指定で/dev/nullを指定し、サブディレクトリの場合は、匿名ボリュームを指定することで実現できます。
サブディレクトリ node_modulesの除外例
下記のように記述すればOK。
先に/appをバインドし、/app/node_modulesを匿名ボリュームでマウントします。
匿名ボリュームは特定のソースを持たないボリュームでDockerホスト内で一意であることが保証されたランダムな名前が付けられます。(まあ特に気にしなくてよい)
1 2 3 4 5 6 7 8 |
services: node: build: . ports: - 8888:8080 volumes: - .:/app - /app/node_modules/ |
RailsとかでもNodeJs使っているプロジェクトでは、この書き方をよく使います。
特定のファイル hoge.txt を除外する
たまーに。サブディレクトリじゃなくて特定のファイルだけ除外したいってこともあります。
その時は、そのファイルを/dev/nullにバインドさせることで、/appボリュームから除外できます。
1 2 3 4 5 6 7 8 |
services: node: build: . ports: - 8888:8080 volumes: - .:/app - /dev/null:/app/hoge.txt |
以上
volumesについては公式でも説明しているから確認してね。