Angenommen, ich habe einen Docker-Container und einen Ordner auf meinem Host /hostFolder
. Wenn ich diesen Ordner nun als Volume zum Docker-Container hinzufügen möchte, kann ich dies entweder mithilfe von ADD
in Dockerfile
tun oder als Volume bereitstellen.
So weit, ist es gut.
Jetzt /hostFolder
enthält einen Unterordner, /hostFolder/subFolder
.
Ich möchte montieren /hostFolder
in den Docker-Container (ob als read-write oder read-only egal, funktioniert bei mir beides), aber ich mache NICHT wollen es beinhaltete /hostFolder/subFolder
. Ich möchte dies ausschließen und den Docker-Container in die Lage versetzen, Änderungen an diesem Unterordner vorzunehmen, ohne dass sich dies auf dem Host ändert.
Ist das möglich? Wenn das so ist, wie?
Mit docker-compose kann ich node_modules lokal verwenden, ignoriere es jedoch im docker-Container mit der folgenden Syntax in docker-compose.yml
volumes:
- './angularApp:/opt/app'
- /opt/app/node_modules/
Also wird alles in ./angularApp
Auf /opt/app
Abgebildet und dann erstelle ich ein anderes Mount-Volume /opt/app/node_modules/
, Das jetzt ein leeres Verzeichnis ist - auch wenn es auf meinem lokalen Computer ./angularApp/node_modules
Ist nicht leer.
Wenn Sie möchten, dass Unterverzeichnisse von docker-compose ignoriert werden, aber dauerhaft bleiben, können Sie in docker-compose.yml
Folgendes tun:
volumes:
node_modules:
services:
server:
volumes:
- .:/app
- node_modules:/app/node_modules
Dadurch wird Ihr aktuelles Verzeichnis als freigegebenes Volume bereitgestellt, aber anstelle Ihres lokalen node_modules
- Verzeichnisses wird ein permanentes Docker-Volume bereitgestellt. Dies ähnelt der Antwort von @kernix, ermöglicht jedoch, dass node_modules
Zwischen docker-compose up
- Durchläufen beibehalten wird, was wahrscheinlich das gewünschte Verhalten ist.
Verwenden Sie Folgendes, um eine Datei auszuschließen
volumes:
- /hostFolder:/folder
- /dev/null:/folder/fileToBeExcluded
Erstens unterscheidet sich die Verwendung der Anweisung ADD
in einer Docker-Datei sehr von der Verwendung eines Volumes (entweder über das Argument -v
Zu docker run
Oder das Argument VOLUME
-Anweisung in einer Docker-Datei). Mit den Befehlen ADD
und COPY
wird zum Zeitpunkt der Ausführung von docker build
Nur eine Kopie der Dateien erstellt. Diese Dateien werden erst aktualisiert, wenn mit dem Befehl docker build
Ein neues Bild erstellt wird. Im Gegensatz dazu bedeutet die Verwendung eines Volumes im Wesentlichen, dass "dieses Verzeichnis nicht im Container-Image gespeichert werden sollte, sondern ein Verzeichnis auf dem Host". Wenn eine Datei in einem Volume geändert wird, wird sie sowohl für den Host als auch für den Container sofort angezeigt.
Ich glaube nicht, dass Sie mit Volumes das erreichen können, was Sie wollen. Sie müssen Ihre Verzeichnisstruktur überdenken, wenn Sie dies tun möchten.
Es ist jedoch recht einfach, COPY
zu verwenden (was ADD
vorzuziehen ist). Sie können entweder eine .dockerignore
- Datei verwenden, um das Unterverzeichnis auszuschließen, oder Sie können COPY
alle Dateien mit einem RUN rm bla
- Befehl entfernen, um das Unterverzeichnis zu entfernen.
Denken Sie daran, dass sich alle Dateien, die Sie mit COPY
oder ADD
zum Bild hinzufügen, im Erstellungskontext befinden müssen, d. H. In oder unter dem Verzeichnis, in dem Sie docker build
Ausführen.
Sieht so aus, als würde die alte Lösung nicht mehr funktionieren (zumindest bei mir). Das Erstellen eines leeren Ordners und das Zuordnen eines Zielordners dazu hat jedoch geholfen.
volumes:
- ./angularApp:/opt/app
- .empty:/opt/app/node_modules/
für die Leute, die auch das Problem hatten, dass der Ordner node_modules immer noch von Ihrem lokalen System überschrieben wird und umgekehrt
volumes:
node_modules:
services:
server:
volumes:
- .:/app
- node_modules:/app/node_modules/
Dies ist die Lösung, mit dem nachgestellten /
nachdem die node_modules das Update sind.
Mit der Docker-Befehlszeile:
docker run \
--mount type=bind,src=/hostFolder,dst=/containerFolder \
--mount type=volume,dst=/containerFolder/subFolder \
...other-args...
Das -v
Option kann auch verwendet werden (Gutschrift an Bogdan Mart ), aber --mount
ist klarer und empfohlen .