Hintergrund
Docker Volume erlaubt es uns, einige Dateien (wie Konfigurationsdateien) dynamisch zu mounten, um die Originaldateien im Image beim Start eines Docker-Containers zu überschreiben, aber was passiert, wenn wir einen Ordner oder eine Datei, die noch nicht auf dem Host existiert, auf den Container mounten? LZ stieß in seiner Arbeit auf ein solches Problem, übte es daher selbst und dokumentierte die experimentellen Ergebnisse wie folgt:
Falterhalterung
Das Verhalten von Docker bei der Ordnerbefestigung ist einheitlich, wie folgt:
- Wenn der Ordner nicht existiert, wird er zuerst erstellt (oder rekursiv, wenn es sich um einen mehrstufigen Ordner handelt)
- Überschreiben Sie den Ordnerinhalt im Container mit dem Ordnerinhalt auf dem Host
Die Details sind wie folgt:
Der Ordner auf dem Host existiert und ist nicht leer
Gastgeber | Container | Mount-Ergebnis | | Nicht-leerer Ordner A existiert | Ordner B, der nicht existiert | Erstelle zuerst Ordner B in Contanier und kopiere dann alle Dateien aus Ordner A in B | | Nicht-leerer Ordner A existiert | Nicht-leerer Ordner B existiert | Zuerst leert man den Originalinhalt des chinesischen Containerordners B und kopiert dann die chinesische Kopie A nach B |
Unabhängig davon, ob Ordner B im Container existiert, überschreibt A den Inhalt von B vollständig
Der Ordner auf dem Host existiert, ist aber leer
Gastgeber | Container | Mount-Ergebnis | | Leerer Ordner A, der existiert | Nicht-leerer Ordner B existiert | Der Inhalt des chinesischen Containerordners B wird entleert |
Der Inhalt des entsprechenden Ordners im Container wird entleert
Der Host-Ordner existiert nicht
Gastgeber | Container | Mount-Ergebnis | | Ordner A, der nicht existiert | Nicht-leerer Ordner B existiert | Erstelle von Ordner A auf dem Host, und der Inhalt des chinesischen Containerordners B wird geleert | | Ordner A/B/C, die nicht existieren | Nicht-leerer Ordner B existiert | Erstelle die Ordner A/B/C auf dem Host, und der Inhalt des chinesischen Container-Ordners B wird geleert |
Der Inhalt des entsprechenden Ordners im Container wird entleert
Zusammenfassung
Der Host-Ordner überschreibt definitiv den chinesischen Container-Ordner:
Gastgeber | Container | Mount-Ergebnis | | Ordner existiert nicht/Ordner existiert, aber ist leer | Der Ordner existiert/existiert nicht, ist aber leer/existiert und ist nicht leer | Der chinesische Behälter wird abgedeckt (entleert) | | Der Ordner existiert und ist nicht leer | Der Ordner existiert/existiert nicht, ist aber leer/existiert und ist nicht leer | Die Inhalte des chinesischen Containers werden überschrieben (der Originalinhalt wird geleert, und der Inhalt des Ordners auf dem Host wird überschrieben) |
Datei-Mounting
Der größte Unterschied zwischen Datei-Mounting und Ordner-Mounting ist:
- Docker verbietet das Mounten von Dateien, die nicht auf dem Host existieren, auf bereits im Container vorhandene Dateien
- Datei-Mounting hat keinen Einfluss auf andere Dateien im selben Ordner
Zusätzlich ist das Überschreibverhalten mit dem Ordnermounting konsistent, d.h.:
- Überschreiben Sie den Inhalt der Datei im Container mit dem Inhalt der Datei auf dem Host
Die Details sind wie folgt:
Gastgeber
Gastgeber | Container | Mount-Ergebnis | | Dateien, die nicht existieren configA.js | Dokumente, die bereits existieren congfigB.js | Fehler: Versuchst du, ein Verzeichnis auf eine Datei einzubinden (oder umgekehrt)? Überprüfen Sie, ob der angegebene Hostpfad existiert und der erwartete Typ ist. Er erzeugt zwei leere Verzeichnisse configA.js und configB.js gleichzeitig auf dem Host, aber der Container kann nicht starten |
Gastgeber
Gastgeber | Container | Mount-Ergebnis | | Aktuelle Akte configA.js | Aktuelle Akte congfigB.js | Container-Chinesisches Element configB.js gleich bleiben, aber der Dateiinhalt wird von den congfigA.js Inhalten überschrieben | | Aktuelle Akte configA.js | Dateien, die nicht existieren congfigB.js | Eine neue Datei configB.js im Container mit dem Inhalt der configA.js Datei bleibt unverändert configB.js allen anderen Dateien unter der Datei |
Zusammenfassung
Die Datei auf dem Host überschreibt immer den chinesischen Ordner des Containers
Gastgeber | Container | Mount-Ergebnis | | Dateien, die nicht existieren | Dokumente, die bereits existieren | Verbotene Handlungen | | Existierende Dokumente | Dateien, die nicht existieren / Dateien, die bereits existieren | Hinzufügen/überschreiben (erstellt ein Verzeichnis, falls es nicht existiert) |
Schlussfolgerung
Falterhalterung
- Wenn du zulässt, dass nicht vorhandene oder leere Ordner im Container montiert werden, werden die entsprechenden Ordner im Container leer.
- Das Anfügen eines nicht leeren Ordners an einen Container überschreibt den ursprünglichen Ordner im Container
Datei-Mounting
- Es ist verboten, nicht existierende Dateien auf Dateien zu mounten, die bereits im Container existieren
- Bestehende Dateien werden überschrieben, wenn sie an den Container angehängt werden, und wenn die Dateien nicht existieren, werden sie erstellt
Anwendungsszenarien
- Aus der obigen Analyse lässt sich erkennen, dass Ordner-Mounting verwendet wird, um Dateien im gesamten Ordner zu überschreiben, sodass es eingesetzt werden kann, wenn eine große Anzahl von Dateien in den Container gemountet werden muss; außerdem, wenn ein leerer Ordner oder ein nicht vorhandener Ordner gemountet wird, wird es in der Regel umgekehrt verwendet: Das heißt, nach dem Start des Containers können einige Dateien (wie Logs) unter dem Ordner des Mounting-Punkts im Container generiert werden, sodass es zu diesem Zeitpunkt direkt im Ordner des entsprechenden Hosts sichtbar ist.
- Dateimounting wird häufig verwendet, um Konfigurationsdateien zu mounten, die die Standardkonfiguration zur Laufzeit dynamisch ändern, da nur eine einzelne Datei überschrieben wird, ohne andere Dateien im selben Ordner im Container zu beeinflussen.
Übertragen von:Der Hyperlink-Login ist sichtbar.
(Ende) |