So lassen Sie einen verknüpften Ordner als normalen Ordner erscheinen

38

Ich habe zwei Dart-Anwendungen, die ich andocken muss. Diese beiden Apps verwenden ein freigegebenes Quellverzeichnis.
Da Docker das Hinzufügen von Dateien aus Ordnern außerhalb des Kontextverzeichnisses verhindert ( project/app1), kann ich weder Dateien aus ../sharednoch von shared(dem darin enthaltenen Symlink projects/app1) hinzufügen .

Ich suche nach einer Möglichkeit, Docker dazu zu verleiten.

Meine vereinfachte Projektstruktur

- projects
  - app1
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - app2
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - shared
    - source

Ich könnte Dockerfileeine Ebene docker buildhöher gehen und von dort aus laufen, aber dann brauche ich zwei Dockerfiles (für app1 und app2) im selben Verzeichnis.

Meine aktuelle Idee war, wenn ich die Tatsache, dass projects/app1/sharedes sich um einen Symlink handelt, irgendwie verbergen könnte, wäre dieses Problem gelöst. Ich habe geprüft, ob ich projectsmit Samba teilen und es an einer anderen Stelle erneut einbinden und Samba so konfigurieren kann, dass Symlinks wie normale Ordner behandelt werden. Ich habe jedoch nicht herausgefunden, ob dies unterstützt wird. Ich habe nicht viel Erfahrung mit Samba und habe es noch nicht ausprobiert. .

Gibt es ein anderes Tool oder einen anderen Trick, der dies zulässt?

Ich würde die Verzeichnisstruktur lieber nicht ändern, da dies andere Probleme verursachen würde und auch lieber keine Dateien herumkopieren würde.

Zoechi
quelle

Antworten:

35

Ich habe nicht viel Erfahrung damit, dockeralso kann ich nicht versprechen, dass dies funktionieren wird, aber eine Möglichkeit wäre, das Verzeichnis zu mounten, anstatt darauf zu verlinken:

$ cd projects/app1
$ mkdir shared
$ sudo mount -o bind ../shared shared/

Das wird anhängen ../sharedzu ./sharedund soll an dem System vollständig transparent sein. Wie erklärt in man mount:

Die Bindung ist montiert.

Seit Linux 2.4.0 ist es möglich, einen Teil der Dateihierarchie an einer anderen Stelle erneut einzuhängen. Der Aufruf lautet:

mount --bind olddir newdir

oder mit diesem fstab-Eintrag:

/olddir /newdir none bind

Nach diesem Aufruf sind an zwei Stellen die gleichen Inhalte zugänglich.

terdon
quelle
1
@zoechi das ist perfekt zum Thema auf beiden Seiten. In der Regel würde ich mehr technische Fragen wie diese zu U & L und mehr Fragen zum Benutzerbereich hier posten. Die Wahl liegt jedoch ganz bei Ihnen. Einerseits gibt es hier mehr Benutzer, also mehr Augäpfel, andererseits gibt es eine viel höhere Konzentration von professionellen * nix-Leuten auf U & L. Stellen Sie nur sicher, dass Sie nicht auf beiden Websites dieselbe Frage stellen. Wenn du es verschieben willst, lösche es oder markiere es für Mod-Aufmerksamkeit und fordere sie auf zu migrieren.
Terdon
2
Für mich war es obligatorisch, den Docker-Daemon neu zu starten! Ansonsten war das montierte Verzeichnis im Container nicht sichtbar.
dim
@dim ja! Ich habe versucht, es mit Capistrano zum Laufen zu bringen und es hat nicht funktioniert - es stellte sich heraus, dass ich die freigegebenen Verzeichnisse gemountet habe, nachdem ich den Container gestartet habe
csch
Leider funktioniert dies nicht für Windows- oder OS X-Benutzer. Die Debatte über dieses Thema war ... lebhaft.
Jason
Ist das Mounten für die Quellcodeverwaltung wie zB Github "festgeschrieben"? oder müsste ich das jedes mal machen
pie6k
23

Dieses Problem ist in der Docker-Community wiederholt aufgetreten. Es verstößt grundsätzlich gegen die Anforderung, dass Dockerfilees wiederholbar sein muss, wenn Sie es ausführen oder ich es ausführen. Daher würde ich diese Fähigkeit nicht erwarten, wie in diesem Ticket beschrieben: Der Befehl Dockerfile ADD folgt keinen Symlinks auf Host # 1676 .

Man muss sich also einen anderen Ansatz vorstellen. Wenn Sie sich dieses Problem ansehen: ADD, um Symlinks im Argument # 6094 zu unterstützen, bietet ein Freund von U & L ( @Patrick aka. Phemmer) eine clevere Lösung.

$ tar -czh . | docker build -

Dadurch werden tardie symbolischen Links aus dem aktuellen Verzeichnis dereferenziert und an den docker build -Befehl weitergeleitet.

Auszug aus der Manpage tar
-c, --create
       create a new archive

-h, --dereference
       follow symlinks; archive and dump the files they point to

-z, --gzip, --gunzip --ungzip
slm
quelle
3
Dies ist eine ausgezeichnete Lösung! Ich verstehe, warum Docker behauptet, diese Funktion auszulassen. Es gibt jedoch einen erheblichen Unterschied in dem Workflow, den ich bei der Entwicklung meines containerize-Projekts verwende, und wie ich davon ausgehe, dass es für die Produktion gebaut wird. Auf meinem lokalen Rechner möchte ich eine super enge Rückkopplungsschleife. Meine App hat 1 Git Repo und die Build-Umgebung für die Container hat ein 2. Repo. Ich muss in der Lage sein, Änderungen vorzunehmen und Tests vor Ort zu erstellen, bevor ich entscheiden kann, ob ich ein Commit und Push durchführen möchte. Ich habe in meinem endgültigen Projekt keine Symlinks oder ADD-Anweisungen.
Bruno Bronosky
6
Andockdateien sind nicht wiederholbar. Dockerdateien können möglicherweise nicht reproduzierbar gemacht werden, da sie fast alle apt-get oder etwas Äquivalentes in der 2. oder 3. Ebene haben und apt-get nicht reproduzierbar ist. Die Docker-Entwicklungsstrategie an einen fehlgeleiteten Versuch zu binden, das Unmögliche möglich zu machen, wird Docker nur mit einer Reihe von schlechten Abstraktionen überhäufen, die niemandem helfen. nathanleclaire.com/blog/2014/09/29/…
Jason
1
Ok, ich verstehe nicht wirklich, warum dies besser ist als ein cpBefehl. Können Sie erklären, warum es besser ist? Ich denke auch, dass die Pfeife verwirrend / zu verworren ist. Warum nicht einfach den Befehl tar über den Befehl build setzen. Ich schätze, dann würden Sie das verknüpfte Verzeichnis mit dem tatsächlichen Verzeichnis überschreiben.
Alexander Mills
1
@AlexanderMills - Der beste Weg, um zu sehen, was passiert, ist, es zu versuchen und den Unterschied zu sehen. Das obige ist auch ein Bau eines Containers, der nicht läuft, also gibt es keine Montage. stackoverflow.com/questions/37328370/… . Ich schlage vor, Sie probieren all diese Dinge aus, es wird viel mehr Sinn machen.
Slm
1
Ich habe gerade /bin/cp ../requirements.txt . && docker build ...ein Makefile hinzugefügt , um den Docker zu
erstellen