Docker folgen dem Symlink außerhalb des Kontexts

92

Noch eine Docker-Symlink-Frage. Ich habe eine Reihe von Dateien, die ich in alle meine Docker-Builds kopieren möchte. Meine dir Struktur ist:

parent_dir
    - common_files
        - file.txt
    - dir1
        - Dockerfile  
        - symlink -> ../common_files

Im obigen Beispiel möchte ich, dass file.txt kopiert wird, wenn ich Docker in dir1 erstelle. Ich möchte jedoch nicht mehrere Kopien von file.txt verwalten. Gemäß diesem Link muss ab Docker-Version 0.10 der Docker-Build erstellt werden

Befolgen Sie die Symlinks im Stammverzeichnis des Containers, um Anweisungen zum Hinzufügen hinzuzufügen.

Ich erhalte jedoch keine solche Datei oder kein solches Verzeichnis, wenn ich mit einer dieser Zeilen in meiner Docker- Datei erstelle:

ADD symlink /path/dirname oder ADD symlink/file.txt /path/file.txt

Die Mount-Option löst es NICHT für mich (plattformübergreifend ...). Ich habe es tar -czh . | docker build -tohne Erfolg versucht .

Gibt es eine Möglichkeit, Docker dazu zu bringen, dem Symlink zu folgen und die Datei common_files / file.txt in den erstellten Container zu kopieren?

Ravi
quelle

Antworten:

69

Das ist nicht möglich und wird nicht umgesetzt. Bitte werfen Sie einen Blick auf die Diskussion zum Github-Problem Nr. 1676 :

Wir erlauben dies nicht, da es nicht wiederholbar ist. Ein Symlink auf Ihrem Computer ist nicht derselbe wie auf meinem Computer, und dieselbe Docker-Datei würde zwei unterschiedliche Ergebnisse liefern. Auch Symlinks zu / etc / paasswd würden Probleme verursachen, da dadurch die Hostdateien und nicht Ihre lokalen Dateien verknüpft würden.

0x7d7b
quelle
Vielen Dank. Ja, ich habe diesen Link schon einmal bemerkt, aber ich dachte, das wäre für eine viel ältere Version von Docker (0.6.1). Das Änderungsprotokoll von 0.10 erwähnt, dass dies möglich ist. Github.com/docker/docker/blob/master/…
Ravi
Auch wenn "parent_dir" auf einem Computer ausgecheckt ist und symlink einen relativen Pfad zu "common_files" hat, kann er wiederholt werden.
Ravi
2
Ihr Zitat Follow symlinks inside container's root for ADD build instructions.bedeutet, dass innerhalb des Containers Symlinks befolgt werden. Nicht im Build-Kontextverzeichnis. Im ADD file.txt /dir/file.txtVerzeichnis dirkönnte sich ein Symlink befinden. Die Argumente, die ich in meiner Antwort zitiert habe, sind weiterhin gültig und Symlinks werden in der neuesten Version immer noch nicht befolgt. Beim Speichern von Symlinks in Revisionskontrollsystemen wie git können Probleme (hinsichtlich der Wiederholbarkeit) auftreten . Bitte beziehen Sie sich daher auf diese Frage .
0x7d7b
1
Ich sehe Ihren Standpunkt in Bezug auf Symlinks in Git. Aber Symlinks müssen nicht in Git gehen. Ein einfaches Setup-Skript kann die lokale Umgebung vorbereiten und Symlinks erstellen. Für mich sind die Kosten für die Aufbewahrung von 'n' Kopien einer freigegebenen Datei aus Wartungssicht zu hoch. Vielleicht muss ich es aus Apache heraus servieren. Vielen Dank.
Ravi
20
Was für eine Schande, obwohl ich den Punkt sehe, folge ich nicht der Logik und es beißt mich. Git verarbeitet Symblinks perfekt und ich erwarte auch, dass Builds auf allen Computern und Umgebungen funktionieren, auf denen das Quell-Repo ausgecheckt ist ..?!
Gregor
9

Eine Möglichkeit besteht darin, den Build im übergeordneten Verzeichnis auszuführen, mit:

$ docker build [tags...] -f dir1/Dockerfile .

(Oder gleichwertig im untergeordneten Verzeichnis)

$ docker build  [tags...] -f Dockerfile ..

Die Docker-Datei muss so konfiguriert sein, dass sie mit den entsprechenden Pfaden kopiert / hinzugefügt werden kann. Abhängig von Ihrem Setup möchten Sie möglicherweise, dass ein .dockerignoreübergeordnetes Element Dinge auslässt, die nicht in den Kontext gestellt werden sollen.

shaunc
quelle
2

Anstatt Simlinks zu verwenden, können Sie das Problem administrativ lösen, indem Sie einfach Dateien von sites_available nach sites_enabled verschieben, anstatt Simlinks zu kopieren oder zu erstellen

Daher befindet sich Ihre Site-Konfiguration nur in einer Kopie im Ordner site_available, wenn sie gestoppt wurde, oder in sites_enabled, wenn sie verwendet werden sollte

Ilya Kolesnikov
quelle
1

Ich weiß, dass es die Portabilität des Docker-Builds beeinträchtigt, aber Sie können feste Links anstelle von symbolischen verwenden:

ln /some/file ./hardlink
Eugene
quelle
4
Dies funktioniert für Dateien und nicht für Verzeichnisse.
GDorn