wake-up-neo.com

Fügen Sie Docker ein Volume hinzu, schließen Sie jedoch einen Unterordner aus

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?

153
Golo Roden

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.

291
kernix

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.

103
Nate T

Verwenden Sie Folgendes, um eine Datei auszuschließen

volumes:
   - /hostFolder:/folder
   - /dev/null:/folder/fileToBeExcluded
13
Frank Wong

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.

13
Adrian Mouat

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/
4
holdbar

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.

3
Daenor

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 .

1
DS.