Angenommen, ich habe einen Docker-Container und einen Ordner auf meinem Host /hostFolder
. Wenn ich diesen Ordner als Docker zum Docker-Container hinzufügen möchte, kann ich dies entweder durch Verwenden ADD
im Dockerfile
oder durch Mounten als Volume tun .
So weit, ist es gut.
/hostFolder
Enthält jetzt einen Unterordner , /hostFolder/subFolder
.
Ich möchte /hostFolder
in den Docker-Container einbinden (ob als schreibgeschützt oder schreibgeschützt, spielt für mich keine Rolle, funktioniert beides), aber ich möchte NICHT , dass er enthalten ist /hostFolder/subFolder
. Ich möchte dies ausschließen, und ich möchte auch, dass der Docker-Container Änderungen an diesem Unterordner vornehmen kann, ohne dass dies auch auf dem Host geändert wird.
Ist das möglich? Wenn das so ist, wie?
quelle
Antworten:
Mit Docker-Compose kann ich node_modules lokal verwenden, aber im Docker-Container mit der folgenden Syntax im ignorieren
docker-compose.yml
Also wird alles in
./angularApp
zugeordnet/opt/app
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
nicht leer ist.quelle
/opt/app/node_modules/
anderes Verzeichnis mit demselben Namen ersetzen . Fehler tritt auf: 'Lautstärke beschäftigt'-v $(pwd):/build/ -v /build/node_modules
If you start a container which creates a new volume, as above, and the container has files or directories in the directory to be mounted (such as /app/ above), the directory’s contents are copied into the volume.
Wenn Sie möchten, dass Unterverzeichnisse von Docker-Compose ignoriert, aber dauerhaft verwendet werden, können Sie Folgendes tun
docker-compose.yml
:Dadurch wird Ihr aktuelles Verzeichnis als freigegebenes Volume bereitgestellt, aber anstelle Ihres lokalen
node_modules
Verzeichnisses wird ein dauerhaftes Docker-Volume bereitgestellt . Dies ähnelt der Antwort von @kernix, ermöglicht jedoch das Fortbestehennode_modules
zwischen dendocker-compose up
Läufen, was wahrscheinlich das gewünschte Verhalten ist.quelle
docker-compose down
entfernt die Container, aber das Volume bleibt bestehen, bis Sie so etwas wiedocker system prune
node_modules:
benannten Volumes das/app/node_modules
im Docker-Container "ignoriert" , kann dieser Beitrag nützlich sein. Wie behandelt Docker mehrere Mount-Typen?Verwenden Sie Folgendes, um eine Datei auszuschließen
quelle
Cannot start service xxx: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"rootfs_linux.go:58: mounting \\\"/dev/null\\\" to rootfs \\\"/var/lib/docker/overlay2/d15ed56ad020d408c63a1f6a6365dbb88d5d3b78a4605980d3faa9861102ef21/merged\\\" at [...] unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
. Das Hinzufügen eines abschließenden Schrägstrichs hat nicht geholfen./dev/null
als Gerätedatei in den Container kopiert .Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
. Dies ist nicht genau das, wonach das OP gesucht hat, aber es war sehr nützlich für mich, da ich eine einzelne Datei ausschließen musste.Erstens unterscheidet sich die Verwendung der
ADD
Anweisung in einer Docker-Datei stark von der Verwendung eines Volumes (entweder über das-v
Argument todocker run
oder dieVOLUME
Anweisung in einer Docker-Datei). Die BefehleADD
undCOPY
nehmen zum Zeitpunkt derdocker build
Ausführung nur eine Kopie der Dateien . Diese Dateien werden erst aktualisiert, wenn mit demdocker build
Befehl ein neues Image erstellt wurde . Im Gegensatz dazu bedeutet die Verwendung eines Volumes im Wesentlichen, dass "dieses Verzeichnis nicht im Container-Image gespeichert werden sollte, sondern stattdessen ein Verzeichnis auf dem Host". Wenn eine Datei in einem Volume geändert wird, wird sie sowohl vom Host als auch vom Container sofort angezeigt.Ich glaube nicht, dass Sie mit Volumes erreichen können, was Sie wollen. Sie müssen Ihre Verzeichnisstruktur überdenken, wenn Sie dies tun möchten.
Es ist jedoch recht einfach zu erreichen
COPY
(was vorzuziehen istADD
). Sie können entweder eine.dockerignore
Datei verwenden, um das Unterverzeichnis auszuschließen, oder Sie könnenCOPY
alle Dateien ausführenRUN rm bla
, um das Unterverzeichnis zu entfernen.Denken Sie daran, dass alle Dateien, die Sie dem Image hinzufügen
COPY
oderADD
mit denen Sie sich im Build-Kontext befinden müssen, dh in oder unter dem Verzeichnis, aus dem Sie ausgeführt werdendocker build
.quelle
.dockerignore
Datei eingefügt werden soll, um ein Unterverzeichnis (oder sogar ein Verzeichnis) auszuschließen. Angesichts des angegebenen Zwecks der Datei ist dies ziemlich seltsam.squash
die Ebenen. Einer ist github.com/goldmann/docker-squash und ein anderer wirdoc ex dockerbuild
aus dem OpenShift-Projekt verwendet.Sieht so aus, als würde die alte Lösung nicht mehr funktionieren (zumindest für mich). Das Erstellen eines leeren Ordners und das Zuordnen eines Zielordners dazu hat jedoch geholfen.
quelle
docker-compose 1.25.0-rc3
Dateisyntax v3.Mit der Docker-Befehlszeile:
Die
-v
Option kann auch verwendet werden (Gutschrift an Bogdan Mart ),--mount
ist jedoch klarer und empfohlen .quelle
für die Leute, die auch das Problem hatten, dass der Ordner node_modules immer noch von Ihrem lokalen System überschrieben wird und umgekehrt
Dies ist die Lösung, wobei das Nachlaufen
/
nach den node_modules der Fix ist.quelle
Um eine gemountete Datei auszuschließen, die im Volume Ihres Computers enthalten ist, müssen Sie sie überschreiben, indem Sie derselben Datei ein Volume zuweisen. In Ihrer Konfigurationsdatei:
Ein Beispiel in Ihrer Docker-Datei:
quelle