Dockerにボリュームを追加しますが、サブフォルダーは除外します


210

ホストにDockerコンテナーとフォルダーがあるとします/hostFolder。このフォルダーをDockerコンテナーにボリュームとして追加する場合は、で使用ADDするDockerfileか、ボリュームとしてマウントすることでこれを行うことができます。

ここまでは順調ですね。

現在/hostFolder、サブフォルダが含まれています/hostFolder/subFolder

/hostFolderDockerコンテナーにマウントしたいのですが(読み取り/書き込みと読み取り専用のどちらでもかまいませんが、どちらでも機能します)、それを含めたくありません/hostFolder/subFolder。これを除外したいと思います。また、Dockerコンテナーがこのサブフォルダーに変更を加えることができるようにしたいのですが、ホスト上でも変更されることはありません。

これは可能ですか?もしそうなら、どうですか?


2
@AbhijitSarkarは、あまり建設的ではありません(または役立つことはありません)コメントです。
カノ2017

1
@狩野答えではなくコメントです。
Abhijit Sarkar 2017年

回答:


398

docker-composeを使用すると、ローカルでnode_modulesを使用できますが、次の構文を使用してdockerコンテナーで無視します docker-compose.yml

volumes:
   - './angularApp:/opt/app'
   - /opt/app/node_modules/

したがって、すべて./angularAppがにマップされ、ローカルマシンが空でない場合でも、現在は空のディレクトリである/opt/app別のマウントボリューム/opt/app/node_modules/が作成され./angularApp/node_modulesます。


3
動作しますが、コンテナ内のこれらの/opt/app/node_modules/ディレクトリを削除できません。例:同じ名前の別のディレクトリに置き換える必要があります。エラーが発生:「ボリュームビジー」
Stepan Yudin

32
末尾のスラッシュを忘れないでください!例えば。/ opt / app / node_modulesは機能しません。./angularApp/node_modulesによって上書きされます
Stingus

3
このトリックは以前は機能していましたが、同じコンポーズファイルでも機能しなくなったようです。それが他の人のためにも機能しなくなったのかどうか知りたい。
プリネハン

8
ありがとう!あなたは私の日を救った!シンプルなドッキングウィンドウを使用する場合には、ありません、それは次のようになりCOMPOS: -v $(pwd):/build/ -v /build/node_modules
ボグダンマート

3
ドキュメントdocs.docker.com/storage/volumes/…を見つけました。If you start a container which creates a new volume, as above, and the container has files or directories in the directory to be mounted (such as /app/ above), the directory’s contents are copied into the volume.
ひろし

118

docker-composeでサブディレクトリを無視したいが永続的なものにしたい場合は、で以下を実行できますdocker-compose.yml

volumes:
  node_modules:
services:
  server:
    volumes:
      - .:/app
      - node_modules:/app/node_modules

これにより、現在のディレクトリが共有ボリュームとしてマウントされますが、ローカルnode_modulesディレクトリの代わりに永続的なDockerボリュームがマウントされます。これは@kernixによる回答に似ていますが、これは実行node_modules間で持続することをdocker-compose up可能にします。これはおそらく望ましい動作です。


20
名前付きボリュームは優れたアプローチです。ヒント:ハイフン付きのボリューム名を使用していないことを確認してください。デバッグの悪夢に人生のほんの一部を費やすだけで、とんでもないニュアンスに再び騙されたことを知るだけです。
dustintheweb 2017年

3
「docker-compose downはこれらの永続的なボリュームを強制終了することに注意してください。」これは、Docker for Mac v 17.0.5+(およびおそらく古いバージョン)では当てはまりません。docker-compose downはコンテナを削除しますが、ボリュームは次のようなものを実行するまで持続しますdocker system prune
BrDaHa 2017

3
名前付きボリュームの使用がDockerコンテナでを「無視」する理由を理解することに興味がある場合は、この投稿が役立つかもしれません。Dockerが複数のマウントタイプを処理する方法 node_modules:/app/node_modules
ira

3
私が何か間違っているのかどうかはわかりませんが、これを行う場合は、コンテナーを起動してから、ホストコンピューターでnpm installを実行すると、コンテナー内のnode_modulesも変更されます。なぜ誰もがそうしたいと思う理由は想像できませんが、それでも私はより明確な分離を探しています。
Renra 2018

3
@Renraにはまったく同じ問題がありました。名前付きボリュームがあっても、ホストマシンは常にnode_modulesを上書きしていました...あらゆる種類の非互換性の問題を引き起こしました。それを修正することをあきらめて、リポジトリ全体ではなく私のsrcフォルダをコピーするだけでそれを回避しました
dancypants

19

ファイルを除外するには、以下を使用します

volumes:
   - /hostFolder:/folder
   - /dev/null:/folder/fileToBeExcluded

6
私が必要とするものに対する完璧なソリューション(Windowsホストでsymlinkのものが壊れたため、node_modulesをホストにマップしないでください)。/ dev / nullを指すことは機能しませんでしたが、空のディレクトリを作成してそれにマッピングすることは完全に機能し、私が抱えていた問題を解決しました-このアイデアに感謝します。
リアムハメット

1
これはDocker for Mac 18.09.0では機能しませんCannot start service xxx: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"rootfs_linux.go:58: mounting \\\"/dev/null\\\" to rootfs \\\"/var/lib/docker/overlay2/d15ed56ad020d408c63a1f6a6365dbb88d5d3b78a4605980d3faa9861102ef21/merged\\\" at [...] unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type。末尾にスラッシュを追加しても効果がありませんでした。
ブレーズ

Docker 18.09.3を搭載したUbuntu 16.04でも動作しないことを確認できます。
Dirk

それは私にはうまくいきません。それが行うのは/dev/null、デバイスファイルとしてコンテナーにコピーすることだけです。
Radon Rosborough、

1
これはファイルを除外する場合にのみ機能することに注意してください!/ dev / nullはファイルであるため、ターゲットにする必要があります。エラーメッセージは次のように非常に明確ですAre you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type。これは、OPが求めていたものとは正確には異なりますが、1つのファイルを除外する必要があったため、私にとって非常に役立ちました。
Avius

13

まず、ADDDockerfileでの命令の使用は、(Dockerfile への引数または命令による)ボリュームの使用とは大きく異なります。そしてコマンドだけ一度にファイルのコピーを取ることが実行されます。これらのファイルは、コマンドで新しいイメージが作成されるまで更新されません。対照的に、ボリュームを使用することは、「このディレクトリはコンテナイメージに格納するべきではなく、代わりにホスト上のディレクトリを使用すること」と言っています。ボリューム内のファイルが変更されると、ホストとコンテナの両方がすぐにそれを認識します。-vdocker runVOLUMEADDCOPYdocker builddocker build

ボリュームを使用して目的を達成できるとは思えません。これを行うには、ディレクトリ構造を再考する必要があります。

ただし、使用するのは非常に簡単ですCOPY(これはに優先する必要がありますADD)。.dockerignoreファイルを使用してサブディレクトリを除外するか、COPYすべてのファイルを使用しRUN rm blaてサブディレクトリを削除することができます。

任意のファイルはあなたがイメージに追加することを忘れないでくださいCOPYまたはADDあなたが実行したディレクトリで以下のビルドコンテキストすなわち内でなければなりませんdocker buildから。


1
毎日新しいことを学んでください:-) COPYとADDは(ホストではなく)ビルドコンテキストから動作します。ボリュームを使用してサブフォルダーをマスクすることはできますか?OPは/ hostFolderをマウントし(私はそう思います)、/ hostFolder / subFolderを切断します。それぞれにボリュームがあり、hostFolderのみが「マウント」されている(-v)場合、サブフォルダーの変更をコンテナーに分離しますか?
グレッグ

よくわかりませんが、ボリュームをネストしたことはありません。良い考えだとは思いませんが、詳しく調べなければなりません。
Adrian Mouat

1
.dockerignoreサブディレクトリ(またはディレクトリ)を除外するためにファイルに何を配置するかの例が見つからないようです。それがファイルの明記された目的だとすると、それはかなり奇妙です。
Lukas Oberhuber、2015

1
ファイルを追加しても、最終的にはいくつかのレイヤーになります。そのため、セキュリティが重要な場合はそれらを非表示にしても、画像サイズを小さくしても(下にあるレイヤーにあるため)効果はありません。squashレイヤーにはオプションがあります。1つはgithub.com/goldmann/docker-squashで、もう1つはopenshiftoc ex dockerbuildプロジェクトから使用しています。
akostadinov

6

古いソリューションはもう機能しないようです(少なくとも私にとって)。空のフォルダーを作成し、そこにターゲットフォルダーをマッピングすることで問題が解決しました。

volumes:
   - ./angularApp:/opt/app
   - .empty:/opt/app/node_modules/

docker-compose 1.25.0-rc3ファイル構文v3では、どちらも機能しません。
thisismydesign

6

dockerコマンドラインで:

docker run \
    --mount type=bind,src=/hostFolder,dst=/containerFolder \
    --mount type=volume,dst=/containerFolder/subFolder \
    ...other-args...

この-vオプションを使用することもできますが(Bogdan Martのクレジット)、--mountより明確で推奨されます。


6

node_modulesフォルダーが引き続きローカルシステムから上書きされるという問題も抱えていた人々のために

volumes:
  node_modules:
services:
  server:
    volumes:
      - .:/app
      - node_modules:/app/node_modules/

これが解決策であり/、node_modulesの後に続くものが修正です。


0

マシンのボリュームに含まれるマウントされたファイルを除外するには、この同じファイルにボリュームを割り当てることにより、ファイルを上書きする必要があります。あなたの設定ファイルで:

services:
  server:
    build : ./Dockerfile
    volumes:
      - .:/app

dockerfileの例:

# Image Location
FROM node:13.12.0-buster
VOLUME /app/you_overwrite_file
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.