web-dev-qa-db-ja.com

ボリュームが既存の入力済みホストとコンテナディレクトリをリンクするとどうなりますか

ドキュメントを検索しましたが、何も表示されなかったので、テストする時間です。しかし、すぐに将来の参考のために...

ホストフォルダーにはコンテナーフォルダーの内容が入力されていますか?

それは反対ですか?

両方のフォルダの内容がマージされていますか? (その場合:同じ名前のファイルが両方のフォルダーにあるとどうなりますか?)

それともエラーが発生しますか?エラーは起動時にスローされますか、それともコンテナ上の既存のデータが入力されたフォルダを指すVOLUMEを使用してイメージを構築しようとしたときにスローされますか?

また、ドキュメントにない別のこと:コンテナの起動時に-vを使用するために、DockerfileでコンテナパスをVOLUMEとして定義する必要がありますか、それともその場でボリュームを作成できますか?

13
NotGaeL

コンテナを実行してホストからボリュームをマウントすると、コンテナに表示されるのはホスト上にあるものだけです。ボリュームマウントはホストディレクトリを指しているため、イメージ内のディレクトリに何かがあった場合はバイパスされます。

このDockerfileからのイメージを使用して:

FROM ubuntu
WORKDIR /vol
RUN touch /vol/from-container
VOLUME /vol

ホストマウントなしで実行すると、イメージの内容がボリュームにコピーされます。

> docker run vol-test ls /vol
from-container 

ただし、ホストからボリュームをマウントすると、ホストのコンテンツのみが表示されます。

> ls $(pwd)/Host
from-Host
> docker run -v $(pwd)/Host:/vol vol-test ls /vol                                                          
from-Host

いいえ、VOLUME命令は必要ありません。動作はそれがなくても同じです。

15
Elton Stoneman

ホストにマウントされたボリュームでDockerコンテナが作成されるときはいつでも、例:

docker run -v /path/on/Host:/data container-image

イメージビルドプロセスのためにすでに/dataにあるコンテンツは常に完全に破棄され、現在/path/on/Hostにあるものが代わりに使用されます。 (/path/on/Hostが存在しない場合、空のディレクトリとして作成されますが、その動作の一部の側面は現在非推奨になっている可能性があります。)

DockerfileでボリュームをVOLUMEで事前定義する必要はありません。 VOLUMEが行うのは、イメージから実行されるコンテナに暗黙の-v /volume/path(ホストマウントパスがないことに注意)引数をdocker runコマンドに追加することだけです。これは、明示的な-v /Host/path:/volume/pathが使用されている場合は無視されます。

2
jwodder