So kopieren Sie Dateien mit Dockerfile vom Host in den Container


76

Ich habe eine Docker-Datei geschrieben, die so aussieht

FROM ubuntu:12.04

RUN apt-get update
RUN apt-get install -y wget

Jetzt habe ich eine Datei abc.txtauf meinem Host-Computer aufgerufen . Wie kann ich es in diesen Container kopieren? Gibt es einen Schritt, den ich in Dockerfile hinzufügen kann, der vom Host in den Container kopiert?


Übrigens ist wget bereits in Ubuntu 12.04 enthalten, wenn der Speicher mir dient
user2915097

2
Ihr Update und Ihre Installation sollten wahrscheinlich in einer Zeile stehen, siehe docs.docker.com/articles/dockerfile_best-practices/#run
Henrik Karlsson

Möchten Sie die Datei in einem Docker-Image oder nur in einem Docker-Container ?
Thomasleveil

Antworten:


108

Verwenden Sie den Befehl COPY wie folgt:

COPY foo.txt /data/foo.txt
# where foo.txt is the relative path on host
# and /data/foo.txt is the absolute path in the image

Weitere Details zu COPY finden Sie in der offiziellen Dokumentation

Eine Alternative wäre die Verwendung von ADD. Dies ist jedoch nicht die beste Vorgehensweise, wenn Sie einige erweiterte Funktionen von ADD wie die Dekomprimierung von tar.gz-Dateien nicht verwenden möchten. Wenn Sie den Befehl ADD weiterhin verwenden möchten, gehen Sie folgendermaßen vor:

ADD abc.txt /data/abc.txt
# where abc.txt is the relative path on host
# and /data/abc.txt is the absolute path in the image

Weitere Details zu ADD finden Sie in der offiziellen Dokumentation


9
Gibt es eine Möglichkeit, dies über den absoluten Pfad des Host-Computers zu tun?
thenakulchawla

10
Leider nein, Sie können nur Dateien aus dem Ordner Ihrer Docker-Datei oder aus Unterordnern davon hinzufügen. Auch Softlinks funktionieren nicht. Dies ist auf den Docker-Erstellungsprozess zurückzuführen. Das Erstellen beginnt mit dem Komprimieren des Verzeichnisses, in dem sich Dockerfile befindet, in einem Archiv und verwendet dieses Archiv zum Abrufen von Dateien, die in ADD / COPY-Befehlen verwendet werden.
George.yord

Danke, ich habe ein Shell-Skript geschrieben, um diesen Teil zu automatisieren. Es wäre besser gewesen, wenn ich das über Dockerfile erledigen könnte.
Thenakulchawla

35

Für diejenigen, die diesen (schrecklich unklaren) Fehler bekommen:

KOPIEREN fehlgeschlagen: stat /var/lib/docker/tmp/docker-builderXXXXXXX/abc.txt: Keine solche Datei oder kein solches Verzeichnis

Es kann viele Gründe geben, darunter:

  • Denken Sie bei Docker-Compose-Benutzern daran, dass die Docker-Compose.yml contextden Kontext der Docker-Datei überschreibt. Ihre COPY-Anweisungen müssen jetzt einen Pfad relativ zu dem, was in docker-compose.yml definiert ist, anstatt relativ zu Ihrer Docker-Datei navigieren.
  • Nachfolgende Kommentare oder ein Semikolon in der COPY-Zeile: COPY abc.txt /app #This won't work
  • Die Datei befindet sich in einem Verzeichnis, das von .dockerignoreoder .gitignorefiles ignoriert wird (Vorsicht vor Platzhaltern)
  • Du hast einen Tippfehler gemacht

Manchmal WORKDIR /abcfolgen COPY . xyz/Arbeiten, bei denen es COPY /abc xyz/fehlschlägt, aber es ist ein bisschen hässlich.


Hinzu kommt, dass beim Verschieben einer Docker-Datei in pycharm der Kontext automatisch geändert wird.
Marcel Wilson

Ahh danke! Findet ein nervtötende , .gitignoredie verhindert ADD foo.zip .in meinem Dockerfile.
Hashlock

5

Ich hatte dieses Problem, konnte das Zeppelin-Verzeichnis [1 GB] nicht in den Docker-Container kopieren und bekam ein Problem

KOPIEREN fehlgeschlagen: stat /var/lib/docker/tmp/docker-builder977188321/zeppelin-0.7.2-bin-all: Keine solche Datei oder kein solches Verzeichnis

Ich verwende Docker Version: 17.09.0-ce und habe das Problem mit den folgenden Schritten behoben.

Schritt 1: Kopieren Sie das Zeppelin-Verzeichnis [das ich in das Docker-Paket kopieren möchte] in das Verzeichnis mit "Dockfile".

Schritt 2: Bearbeiten Sie die Dock-Datei und fügen Sie den Befehl [Speicherort, an den wir kopieren möchten] hinzu. ADD ./zeppelin-0.7.2-bin-all / usr / local /

Schritt 3: Wechseln Sie in das Verzeichnis, das DockFile enthält, und führen Sie den Docker-Build [Befehl auch verfügbar] aus

Schritt 4: Docker-Image erfolgreich mit Protokollen erstellt

Schritt 5/9: ADD ./zeppelin-0.7.2-bin-all / usr / local / ---> 3691c902d9fe

Schritt 6/9: WORKDIR $ ZEPPELIN_HOME ---> 3adacfb024d8 .... Erfolgreich erstellt b67b9ea09f02


3
Der wichtige Schritt hierbei ist die Tatsache, dass sich die Datei im selben Ordner wie die Docker-Datei befinden muss
Bormat


1

Ich habe mit Docker 19.03.8 unter CentOS 7 den folgenden Fehler erhalten:

COPY failed: stat /var/lib/docker/tmp/docker-builderXXXXXXX/abc.txt: no such file or directory

Die Lösung für mich war, aus Docker-Datei mit docker build .statt zu bauen docker build - < Dockerfile.


0

Ich konnte eine Datei von meinem Host in den Container innerhalb einer Docker-Datei als solche kopieren:

  1. Erstellt einen Ordner auf meinem c-Treiber -> c: \ docker
  2. Erstellen Sie eine Testdatei im selben Ordner -> c: \ docker \ test.txt
  3. Erstellen Sie eine Docker-Datei im selben Ordner -> c: \ docker \ dockerfile
  4. Der Inhalt der Docker-Datei lautet wie folgt, um eine Datei vom lokalen Host in das Stammverzeichnis des Containers zu kopieren: FROM ubuntu: 16.04

    COPY test.txt /

  5. Ziehen Sie eine Kopie von Ubuntu vom Docker Hub -> Docker Pull Ubuntu: 16.04
  6. Erstellen Sie das Image aus der Docker-Datei -> Docker-Build -t myubuntu c: \ Docker \
  7. Erstellen Sie den Container aus Ihrem neuen Image myubuntu -> Docker run -d -it --name myubuntucontainer myubuntu "/ sbin / init"
  8. Stellen Sie eine Verbindung zum neu erstellten Container her -> docker exec - it myubuntucontainer bash
  9. Überprüfen Sie, ob sich die Datei text.txt im Stammverzeichnis befindet -> ls

Sie sollten die Datei sehen.


0

Wenn Sie den Inhalt des aktuellen Verzeichnisses kopieren möchten, können Sie Folgendes ausführen:

docker build  -t <imagename:tag> -f- ./ < Dockerfile
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.