2015-03-21 4 views
68

Angenommen, ich habe einen Docker Container und einen Ordner auf meinem Host /hostFolder. Wenn ich nun diesen Ordner dem Docker-Container als Volume hinzufügen möchte, kann ich dies tun, indem ich entweder ADD in der Dockerfile anlege oder ihn als Volume mounte.Hinzufügen eines Volumes zu Docker, aber einen Unterordner auszuschließen

So weit, so gut.

Jetzt /hostFolder enthält einen Unterordner, /hostFolder/subFolder.

Ich möchte /hostFolder in den Docker Behälter (ob als read-write oder read-only keine Rolle spielt, funktioniert sowohl für mich) montieren, aber ich NICHT es /hostFolder/subFolder enthalten haben wollen. 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 werden muss.

Ist das möglich? Wenn das so ist, wie?

+1

@AbhijitSarkar das ist kein sehr konstruktiv (noch in irgendeiner Weise hilfreich) Kommentar. – Kano

+1

@Kano Es ist ein Kommentar, keine Antwort. –

Antwort

37

Wenn Sie mit dem Docker-compose ignoriert Unterverzeichnisse haben wollen, aber hartnäckig, können Sie Folgendes in docker-compose.yml tun:

volumes: 
    node_modules: 
services: 
    server: 
    volumes: 
     - .:/app 
     - node_modules:/app/node_modules 

Dies wird Ihr aktuelles Verzeichnis als Shared Volume bereitstellen, sondern montieren ein persistentes Docker Volumen anstelle Ihres lokalen Verzeichnisses node_modules.Dies ist ähnlich der Antwort von @kernix, aber dies ermöglicht node_modules zwischen docker-compose up läuft, was wahrscheinlich das gewünschte Verhalten ist.

+1

Named Volumes sind ein überlegener Ansatz. Protip: Stellen Sie sicher, dass Sie keinen Bindestrich verwenden. Du wirst einen kleinen Teil deines Lebens in einem Debug-Albtraum verbringen, nur um herauszufinden, dass du wieder von einer lächerlichen Nuance getäuscht worden bist. – dustintheweb

+2

"Beachten Sie, dass Docker-Compose-Down diese persistenten Volumes auslöschen wird." Dies gilt nicht für Docker for Mac Version 17.0.5 (und möglicherweise ältere Versionen). 'docker-compose down' wird die Container entfernen, aber das Volume bleibt bestehen, bis Sie etwas wie' docker system prune' ausführen. – BrDaHa

+1

Falls jemand versteht, * warum * das 'node_modules:' benannte Volume "ignoriert" das '/app/node_modules "im Docker-Container, kann diesen Beitrag nützlich finden [Wie docker behandelt mehrere mount-Typen?] (https://stackoverflow.com/a/47873699/2235814) – ira

12

Zuerst unter Verwendung des ADD Befehl in einem Dockerfile ist sehr verschieden von einem Volumen (entweder über das -v Argument docker run oder VOLUME Instruktion in einem Dockerfile). Die ADD und COPY Befehle nehmen nur eine Kopie der Dateien zum Zeitpunkt docker build ausgeführt wird. Diese Dateien werden erst aktualisiert, wenn ein neues Image mit dem Befehl docker build erstellt wurde. Im Gegensatz dazu bedeutet die Verwendung eines Volumes im Wesentlichen "Dieses Verzeichnis sollte nicht im Container-Image gespeichert werden, sondern stattdessen ein Verzeichnis auf dem Host"; Immer wenn eine Datei in einem Volume geändert wird, sehen Host und Container diese sofort.

Ich glaube nicht, dass Sie erreichen können, was Sie wollen mit Volumen, müssen Sie Ihre Verzeichnisstruktur überdenken, wenn Sie dies tun möchten.

Es ist jedoch ziemlich einfach zu erreichen mit COPY (die ADD vorgezogen werden sollte). Sie können entweder eine .dockerignore Datei verwenden, um das Unterverzeichnis auszuschließen, oder Sie können COPY alle Dateien dann eine RUN rm bla, um das Unterverzeichnis zu entfernen.

Denken Sie daran, dass alle Dateien, die Sie Bild hinzufügen, mit COPY oder ADD innerhalb des Build-Kontext sein muss, das heißt, in oder unter dem Verzeichnis führen Sie docker build aus. mit der folgenden Syntax in der ich erstelle docker-compose.yml

volumes: 
    - './angularApp:/opt/app' 
    - /opt/app/node_modules/ 

Also alles in ./angularApp-/opt/app abgebildet wird und dann

+1

lerne jeden Tag etwas neues :-) Die COPY- und ADD-Arbeit aus dem Build-Kontext (nicht der Host). Wäre es möglich, einen Datenträger zum Maskieren des Unterordners zu verwenden? Das OP möchte den/hostFolder (glaube ich) bereitstellen und make/hostFolder/subFolder getrennt machen. Wenn es für jedes ein VOLUME gab, aber nur der hostFolder 'gemountet' wurde (-v), würde das den subFolder-Wechsel zum Container isolieren? – Greg

+0

Ich bin mir nicht sicher, ich habe nie versucht, Volumes zu verschachteln. Ich bin nicht überzeugt, dass es eine gute Idee ist, aber ich müsste mich darum kümmern. –

+1

Ich kann anscheinend nirgendwo ein Beispiel finden, was man in eine '.dockerignore' Datei schreiben kann, um ein Unterverzeichnis (oder sogar ein Verzeichnis) auszuschließen. Da dies der angegebene Zweck der Datei ist, ist es ziemlich seltsam. –

131

Mit Docker-compose ich in der Lage bin node_modules lokal zu verwenden, aber es in den Docker Behältern ignorieren ein weiteres mount volume /opt/app/node_modules/ das ist jetzt leeres Verzeichnis - auch wenn in meinem lokalen Rechner ./angularApp/node_modules nicht leer ist.

+28

Sie sind ein Gentleman und ein Gelehrter. Brillant! –

+1

@RichardClayton danke für das Kompliment :-) – kernix

+0

@kemix - genial! –

5

Um eine Datei auszuschließen, verwenden Sie die folgende

volumes: 
    - /hostFolder:/folder 
    - /dev/null:/folder/fileToBeExcluded 
+1

Perfekte Lösung für das, was ich brauchte (um node_module nicht auf den Host zu mappen, weil Symlink-Sachen auf einem Windows-Host kaputt gegangen sind). Auf/dev/null zu zeigen funktionierte nicht, aber ein leeres Verzeichnis zu erstellen und es zuzuordnen, funktionierte perfekt und löste die Probleme, die ich hatte - danke für diese Idee. –

Verwandte Themen