web-dev-qa-db-ja.com

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

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

ここまでは順調ですね。

これで、/hostFolderにはサブフォルダー/hostFolder/subFolderが含まれます。

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

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

138
Golo Roden

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

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

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

251
kernix

Docker-composeでサブディレクトリを無視しても永続的にしたい場合は、docker-compose.ymlで次を実行できます。

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

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

98
Nate Todd

まず、DockerfileでADD命令を使用することはveryボリュームを使用する場合とは異なります(-vdocker run引数またはDockerfileでVOLUME命令を使用する場合)。 ADDおよびCOPYコマンドは、docker buildの実行時にファイルのコピーを取得するだけです。これらのファイルは、docker buildコマンドで新しいイメージが作成されるまで更新されません。対照的に、ボリュームを使用することは、本質的に「このディレクトリはコンテナイメージに保存しないでください。代わりにホスト上のディレクトリを使用してください」と言っています。ボリューム内のファイルが変更されると、ホストとコンテナーの両方がすぐにそれを見ることになります。

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

ただし、COPYADDよりも望ましい)を使用して達成するのは非常に簡単です。 .dockerignoreファイルを使用してサブディレクトリを除外するか、すべてのファイルをCOPYしてからRUN rm blaを実行してサブディレクトリを削除できます。

COPYまたはADDを使用してイメージに追加するファイルは、ビルドコンテキスト内(つまり、docker buildを実行するディレクトリ内またはその下)にある必要があることに注意してください。

13
Adrian Mouat

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

volumes:
   - /hostFolder:/folder
   - /dev/null:/folder/fileToBeExcluded
12
Frank Wong

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

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

node_modulesフォルダーがローカルシステムから上書きされたり、その逆の問題が発生したりする人のために

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

これが解決策です。node_modulesの後に続く/が修正されます。

1
Daenor

Dockerコマンドラインを使用:

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

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

0
DS.