ホスト/hostFolder
にDockerコンテナーとフォルダーがあるとします。このフォルダーをボリュームとしてDockerコンテナーに追加する場合は、ADD
でDockerfile
を使用するか、ボリュームとしてマウントすることでこれを実行できます。
ここまでは順調ですね。
これで、/hostFolder
にはサブフォルダー/hostFolder/subFolder
が含まれます。
/hostFolder
をDockerコンテナにマウントします(読み取り/書き込みまたは読み取り専用のどちらでもかまいませんが、どちらでも動作します)が、ではなくを含めて/hostFolder/subFolder
を含めます。これを除外し、Dockerコンテナーがこのサブフォルダーに変更を加えられるようにしたいのですが、ホスト上でも変更されているという結果にはなりません。
これは可能ですか?もしそうなら、どのように?
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
を作成します。
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
の実行間で持続できるようになります。これはおそらく望ましい動作です。
まず、DockerfileでADD
命令を使用することはveryボリュームを使用する場合とは異なります(-v
のdocker run
引数またはDockerfileでVOLUME
命令を使用する場合)。 ADD
およびCOPY
コマンドは、docker build
の実行時にファイルのコピーを取得するだけです。これらのファイルは、docker build
コマンドで新しいイメージが作成されるまで更新されません。対照的に、ボリュームを使用することは、本質的に「このディレクトリはコンテナイメージに保存しないでください。代わりにホスト上のディレクトリを使用してください」と言っています。ボリューム内のファイルが変更されると、ホストとコンテナーの両方がすぐにそれを見ることになります。
ボリュームを使用して目的を達成できるとは思わないので、これを行うにはディレクトリ構造を再考する必要があります。
ただし、COPY
(ADD
よりも望ましい)を使用して達成するのは非常に簡単です。 .dockerignore
ファイルを使用してサブディレクトリを除外するか、すべてのファイルをCOPY
してからRUN rm bla
を実行してサブディレクトリを削除できます。
COPY
またはADD
を使用してイメージに追加するファイルは、ビルドコンテキスト内(つまり、docker build
を実行するディレクトリ内またはその下)にある必要があることに注意してください。
ファイルを除外するには、次を使用します
volumes:
- /hostFolder:/folder
- /dev/null:/folder/fileToBeExcluded
古いソリューションはもう機能しないようです(少なくとも私にとって)。ただし、空のフォルダーを作成し、ターゲットフォルダーをそれにマッピングしました。
volumes:
- ./angularApp:/opt/app
- .empty:/opt/app/node_modules/
node_modulesフォルダーがローカルシステムから上書きされたり、その逆の問題が発生したりする人のために
volumes:
node_modules:
services:
server:
volumes:
- .:/app
- node_modules:/app/node_modules/
これが解決策です。node_modulesの後に続く/
が修正されます。
Dockerコマンドラインを使用:
docker run \
--mount type=bind,src=/hostFolder,dst=/containerFolder \
--mount type=volume,dst=/containerFolder/subFolder \
...other-args...
-v
オプションを使用することもできます( Bogdan Mart のクレジット)が、--mount
はより明確で 推奨 です。