2014-07-02 11 views
74

In meinem Dockerfile ich habe:Docker: das Hinzufügen einer Datei von einem übergeordneten Verzeichnis

ADD ../../myapp.war /opt/tomcat7/webapps/ 

Diese Datei existiert als ls ../../myapp.war mir die richtige Datei zurückgibt, aber wenn ich sudo docker build -t myapp . ausführen ich habe:

Step 1 : ADD ../../myapp.war /opt/tomcat7/webapps/ 
2014/07/02 19:18:09 ../../myapp.war: no such file or directory 

Weiß jemand warum und wie man es richtig macht?

+1

Einige Abhilfen http://superuser.com/questions/842642 –

Antwort

71

Leider (aus praktischen und Sicherheitsgründen denke ich), wenn Sie lokalen Inhalt hinzufügen/kopieren möchten, muss es unter dem gleichen Stammpfad als die Dockerfile befinden.

Von the documentation:

Die <src> Papierweg in Zusammenhang mit der Build sein muss; Sie kann nicht ../etwas/etwas hinzufügen, da der erste Schritt eines Docker Build ist, das Kontextverzeichnis (und Unterverzeichnissen) an den Docker Dämon senden.

EDIT: Es gibt nun eine Option (-f) den Pfad Ihres Dockerfile zu setzen; Es kann verwendet werden, um zu erreichen, was Sie wollen, siehe @Boedys Antwort nelow.

+12

Gibt es eine "saubere" Abhilfe für dieses? Ich würde mein gesamtes Projektverzeichnis nicht einfach umstrukturieren, nur um dies zu berücksichtigen. –

+0

Wie von @ Günter gesagt, gibt es hier einen Workaround http://superuser.com/a/842690/136024 ... ist es wirklich "sauber"? Nun, zumindest ist es ein "Workaround" :) –

+1

Bessere Antwort von @Boedy http://Stackoverflow.com/a/34300129/2950621 – nmgeek

80

Sie können die Dockerfile aus dem übergeordneten Verzeichnis erstellen:

docker build -t <some tag> -f <dir/dir/Dockerfile> . 
+0

reibungslos funktioniert;) –

+1

Vielen Dank! Dies funktioniert auf einer lokalen Box, aber Docker Hub kann das Image nicht erstellen, da es versucht, es aus dem gleichen Verzeichnis (TBH, was man normalerweise erwarten würde) zu tun. Gibt es eine Möglichkeit, den gleichen Trick in Docker Hub zu tun? –

+0

Nicht, dass ich weiß. Sie könnten das Image in die Registrierung verschieben, anstatt das automatisierte Build zu verwenden. – Boedy

4

Die Lösung für diejenigen, die Komponisten verwenden ist ein volume Hinweis auf den übergeordneten Ordner zu verwenden:

#docker-composer.yml 

foo: 
    build: foo 
    volumes: 
    - ./:/src/:ro 

Aber ich bin ziemlich sicher, dass das mit volumes in Dockerfile getan werden kann.

+3

Es kann nicht. _Hinweis: Das Host-Verzeichnis ist von Natur aus hostabhängig. Aus diesem Grund ** können Sie kein Host-Verzeichnis aus Dockerfile ** mounten, da die erstellten Images portierbar sein sollten. Ein Host-Verzeichnis wäre nicht auf allen potenziellen Hosts verfügbar. https://docs.docker.com/engine/tutorials/dockervolumes/#mount-a-host-directory-as-a-data-volume –

2

Da -f ein anderes Problem verursachte, entwickelte ich eine andere Lösung.

  • erstellen Basisbild in den übergeordneten Ordner
  • hinzugefügt, um die benötigten Dateien.
  • Dieses Bild wurde als Basisbild für das Projekt in einem Nachkommeordner verwendet.

Die -f Flagge hat mein Problem nicht gelöst, weil mein onbuild Bild für eine Datei in einem Ordner aussieht und hatte so zu nennen:

-f foo/bar/Dockerfile foo/bar

statt

-f foo/bar/Dockerfile .

Beachten Sie auch, dass dies nur eine Lösung für einige Fälle ist, wie -f Flagge

29

Mit Docker-compose könnten Sie Kontextordner festgelegt:

#docker-compose.yml 
version: '3.3'  
services: 
     yourservice: 
     build: 
      context: ./ 
      dockerfile: ./docker/yourservice/Dockerfile 
Verwandte Themen