Docker: Hinzufügen einer Datei aus einem übergeordneten Verzeichnis


182

In meinem Dockerfilehabe ich:

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

Diese Datei existiert, da sie ls ../../myapp.warmir die richtige Datei zurückgibt, aber wenn ich sie ausführe, sudo docker build -t myapp .habe ich:

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?


Antworten:


221

Sie können die Docker-Datei aus dem übergeordneten Verzeichnis erstellen:

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

3
Danke dir! Dies funktioniert gut auf einer lokalen Box, aber Docker Hub kann das Image nicht erstellen, da es versucht, es aus demselben Verzeichnis zu erstellen (tbh, genau das, was man normalerweise erwarten würde). Gibt es eine Möglichkeit, denselben Trick in Docker Hub auszuführen?
Marcel Hernandez

Nicht, dass ich davon Wüste. Sie können das Image in die Registrierung verschieben, anstatt die automatische Erstellung zu verwenden.
Boedy

2
@ eduncan911 Ich glaube nicht, dass dies zum Zeitpunkt des Schreibens meines Kommentars veraltet ist. Vielleicht haben sie seitdem ihre Meinung geändert? Wenn ich falsch liege, können Sie auf die Dokumentation verweisen, in der steht, dass sie veraltet ist. Vielen Dank!
Omninonsense

6
-f scheint gemäß den Dokumenten nicht veraltet zu sein -> Geben Sie eine Docker-Datei (-f) an : docs.docker.com/engine/reference/commandline/build/…
Ray

6
@ eduncan911 kannst du deinen Kommentar löschen, da er anscheinend nicht veraltet ist? Ich habe diese Antwort zunächst wegen Ihres Kommentars übersprungen.
Chris Anderson

103

Leider muss (aus praktischen und Sicherheitsgründen, denke ich), wenn Sie lokalen Inhalt hinzufügen / kopieren möchten, dieser sich unter demselben Stammpfad befinden wie der Dockerfile.

Aus der Dokumentation :

Der Pfad <src> muss sich im Kontext des Builds befinden. Sie können nicht hinzufügen ../something / Something , da der erste Schritt eines Docker- Builds darin besteht, das Kontextverzeichnis (und die Unterverzeichnisse) an den Docker-Daemon zu senden.

BEARBEITEN: Es gibt jetzt eine Option ( -f), um den Pfad Ihrer Docker-Datei festzulegen. Es kann verwendet werden, um das zu erreichen, was Sie wollen, siehe die Antwort von @Boedy unten.


22
Gibt es dafür eine "saubere" Problemumgehung? Ich möchte lieber nicht mein gesamtes Projektverzeichnis umstrukturieren, nur um dies zu berücksichtigen.
ben_frankly

Wie von @ Günter gesagt, gibt es hier eine Problemumgehung superuser.com/a/842690/136024 ... ist es wirklich "sauber"? Nun, zumindest ist es eine "Problemumgehung" :)
Anthony O.

2
Siehe bessere Antwort von @Boedy stackoverflow.com/a/34300129/2950621
nmgeek

101

Mit Docker-Compose können Sie den Kontextordner festlegen:

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

9

Hinzufügen einiger Codefragmente zur Unterstützung der akzeptierten Antwort.

Verzeichnisaufbau :

setup/
 |__docker/DockerFile
 |__target/scripts/<myscripts.sh>
src/
 |__<my source files>

Docker-Dateieintrag:

RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/scripts/
RUN mkdir -p /home/vagrant/dockerws/chatServerInstaller/src/
WORKDIR /home/vagrant/dockerws/chatServerInstaller

#Copy all the required files from host's file system to the container file system.
COPY setup/target/scripts/install_x.sh scripts/
COPY setup/target/scripts/install_y.sh scripts/
COPY src/ src/

Befehl zum Erstellen des Docker-Images

docker build -t test:latest -f setup/docker/Dockerfile .

toller Ansatz. Ist es möglich, auch den Code von zu teilen install_x.sh?
Ariful Haque

4

Die Lösung für Benutzer von Composer besteht darin, ein Volume zu verwenden, das auf den übergeordneten Ordner verweist:

#docker-composer.yml

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

Aber ich bin mir ziemlich sicher, dass man mit Volumes in Dockerfile spielen kann .


3
Es kann nicht. Hinweis: Das Hostverzeichnis ist naturgemäß hostabhängig. Aus diesem Grund können Sie kein Hostverzeichnis aus Dockerfile bereitstellen, da erstellte Images portabel sein sollten. Ein Hostverzeichnis wäre nicht auf allen potenziellen Hosts verfügbar. docs.docker.com/engine/tutorials/dockervolumes/…
Peeter Kokk

4

Da -fein anderes Problem verursacht wurde, entwickelte ich eine andere Lösung.

  • Erstellen Sie ein Basis-Image im übergeordneten Ordner
  • Die erforderlichen Dateien wurden hinzugefügt.
  • Verwendete dieses Image als Basis-Image für das Projekt, das sich in einem untergeordneten Ordner befindet.

Das -fFlag löst mein Problem nicht, da mein onbuildBild nach einer Datei in einem Ordner sucht und wie folgt aufrufen musste:

-f foo/bar/Dockerfile foo/bar

anstatt

-f foo/bar/Dockerfile .

Beachten Sie auch, dass dies nur in einigen Fällen eine Lösung als -fFlag ist

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.