バックグラウンド
Dockerボリュームは、Dockerコンテナを起動する際にイメージ内の元のファイルを上書きするために、設定ファイルなどのファイルを動的にマウントできますが、ホストにまだ存在しないフォルダやファイルをコンテナにマウントした場合はどうなるのでしょうか? LZはそのような問題に直面したため、自ら練習し、実験結果を以下のように記録しました。
フォルダーマウント
フォルダマウントに関するDockerの挙動は均一で、以下のように通りです。
- もしフォルダが存在しない場合は、まずそのフォルダが作成されます(または複数レベルフォルダーの場合は再帰的に作成されます)
- ホストのフォルダ内容でコンテナ内の内容を上書きします
詳細は以下の通りです。
ホストのフォルダは存在し、空ではありません
ホスト | コンテナ | マウント結果 | | 空でないフォルダAが存在します | 存在しないフォルダB | まずContanierでフォルダBを作成し、その後フォルダAのすべてのファイルをBにコピーします | | 空でないフォルダAが存在します | 空でないフォルダーBが存在します。 | まず、コンテナ中国語フォルダBの元の内容を空にし、次にAの中国語コピーをBにコピーします |
コンテナ内のフォルダBが存在するかどうかにかかわらず、AはBの内容を完全に上書きします
ホスト上のフォルダは存在しますが空です
ホスト | コンテナ | マウント結果 | | 存在する空のフォルダA | 空でないフォルダーBが存在します。 | コンテナ中国語フォルダーBの中身は空にされます |
コンテナ内の対応するフォルダの内容は空になります
ホストフォルダは存在しません
ホスト | コンテナ | マウント結果 | | 存在しないフォルダA | 空でないフォルダーBが存在します。 | ホストでフォルダAを作成し、コンテナの中国語フォルダBの内容を空にします | | 存在しないフォルダA/B/C | 空でないフォルダーBが存在します。 | ホストでA/B/Cのフォルダを作成し、コンテナの中国語フォルダBの内容を空にします |
コンテナ内の対応するフォルダの内容は空になります
概要
ホストフォルダは確実にコンテナの中国語フォルダを上書きします:
ホスト | コンテナ | マウント結果 | | フォルダは存在しません/フォルダは存在しますが空です | フォルダは存在しません/存在しますが空です/存在しますが空ではありません | 容器の中国製のピースが覆われ(空に) | | フォルダは存在し、空ではありません | フォルダは存在しません/存在しますが空です/存在しますが空ではありません | コンテナ中国語フォルダの内容は上書きされます(元の内容は空にされ、ホスト側のフォルダの内容も上書きされます) |
ファイルマウント
ファイルマウントとフォルダマウントの最大の違いは以下の通りです:
- Dockerはホストに存在しないファイルをコンテナ内に既に存在するファイルへのマウントを禁止しています
- ファイルのマウントは同じフォルダ内の他のファイルには影響しません
さらに、その上書き動作はフォルダマウントと整合しており、すなわち:
- コンテナ内のファイルの内容をホスト上のファイルの内容で上書きします
詳細は以下の通りです。
ホスト
ホスト | コンテナ | マウント結果 | | 存在しないファイルconfigA.js | すでに存在する文書congfigB.js | エラー、ディレクトリをファイルにマウントしようとしていますか?(またはその逆ですか?) 指定されたホストパスが存在し、期待されるタイプかどうかを確認してください。 ホスト上で同時に2つの空のディレクトリconfigA.jsとconfigB.jsを生成しますが、コンテナは起動できません |
ホスト
ホスト | コンテナ | マウント結果 | | プレゼントファイルconfigA.js | 現在のファイルcongfigB.js | コンテナ中国語アイテムconfigB.js同じままですが、ファイルの内容はcongfigA.jsの内容で上書きされます | | プレゼントファイルconfigA.js | 存在しないファイルcongfigB.js | configB.js configA.jsファイルの内容を含むコンテナ内の新しいファイルは、そのファイル内の他のファイルconfigB.js変更されずに残ります |
概要
ホスト上のファイルは常にコンテナの中国語フォルダを上書きします
ホスト | コンテナ | マウント結果 | | 存在しないファイル | 既に存在する文書 | 禁止行為 | | 現存する文書 | 存在しないファイル/すでに存在するファイル | 追加/上書き(存在しないディレクトリを作成する) |
結論
フォルダーマウント
- 存在しないフォルダや空のフォルダをコンテナにマウントさせれば、対応するフォルダは空になります
- 空でないフォルダをコンテナに付けると、コンテナ内の元のフォルダが上書きされます
ファイルマウント
- 存在しないファイルをコンテナ内にすでに存在するファイルにマウントすることは禁止されています
- 既存のファイルはコンテナに添付されると上書きされ、存在しない場合はファイルが作成されます
応用シナリオ
- 上記の分析から、フォルダマウントはフォルダ全体のファイルを上書きするために使われることがわかります。つまり、多数のファイルをコンテナにマウントする必要がある場合にも使えます。さらに、空のフォルダや存在しないフォルダがマウントされた場合は、一般的に逆に使われます。つまり、コンテナが起動された後、一部のファイル(ログなど)がコンテナ内のマウントポイントのフォルダの下に生成され、その時点で対応するホストのフォルダ内で直接確認できます。
- ファイルマウントは、設定ファイルをマウントして実行時にデフォルト設定を動的に変更するためによく使われます。なぜなら、同じフォルダ内の他のファイルには影響しないため、単一のファイルだけを上書きするからです。
転属先:ハイパーリンクのログインが見えます。
(終わり) |