webentwicklung-frage-antwort-db.com.de

So kopieren Sie eine einzelne Datei mit den Kopier- / Hinzufügungsanweisungen von Docker in ein Bild

Ich versuche, eine einzelne Datei aus dem Stammverzeichnis des Build-Kontexts in ein neu erstelltes Verzeichnis in einem Docker-Image zu kopieren.

Das Dockerfile, das ich benutze, ist wie folgt:

FROM debian:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY test.txt /usr/src/app

Die test.txt-Datei ist eine einfache ASCII Textdatei wie folgt:

$ cat test.txt 
This is a test

Wenn ich dieses Image erstelle, erhalte ich jedoch ein Image, das besagt, dass der Zielpfad kein Verzeichnis ist.

$ docker build .
Sending build context to Docker daemon 4.608 kB
Sending build context to Docker daemon 
Step 0 : FROM debian:latest
 ---> 9a61b6b1315e
Step 1 : RUN mkdir -p /usr/src/app
 ---> Using cache
 ---> 86bd44a8776e
Step 2 : WORKDIR /usr/src/app
 ---> Using cache
 ---> ed6771adc681
Step 3 : ADD test.txt /usr/src/app
stat /var/lib/docker/devicemapper/mnt/ee5b9b7029f2adf27d332cbb0d98d6ad9927629a7569fd2d9574cb767b23547b/rootfs/usr/src/app/test.txt: not a directory

Ich habe versucht, mehrere Kombinationen von Docker-Versionen, Basisimages und Distributionen mit installiertem Docker zu verwenden. Ich habe auch versucht, ADD anstelle von COPY zu verwenden, aber das Ergebnis ist das gleiche.

Ich versuche dies derzeit unter CentOS 7 mit der folgenden Docker-Version:

Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 786b29d
OS/Arch (client): linux/AMD64
Server version: 1.7.1
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 786b29d
OS/Arch (server): linux/AMD64

Was mir aufgefallen ist, ist, dass ich ein Verzeichnis kopieren kann, aber keine Datei. Wenn ich zum Beispiel ein "Test" -Verzeichnis im Erstellungskontext-Stammverzeichnis erstelle und test.txt in das Testverzeichnis lege, kann ich das Verzeichnis erfolgreich kopieren:

FROM debian:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY test /usr/src/app

Beachten Sie, dass ich im obigen Dockerfile das gesamte Verzeichnis ./test kopiere und nicht nur ./test.txt. Dieser Build erfolgreich.

In der Docker-Dokumentation ist der folgende Anwendungsbeispielfall für die Anweisung COPY enthalten, der dem entspricht, was ich zu tun versuche:

COPY hom?.txt /mydir/

Kann jemand darauf hinweisen, was ich falsch mache? Wie kann ich eine einzelne Datei kopieren?

22
Andrew Butler

Wie in der Dockerfile-Dokumentation angegeben:

  • Wenn es sich bei <src> Um eine andere Art von Datei handelt, wird sie zusammen mit ihren Metadaten einzeln kopiert. Wenn in diesem Fall <dest> Mit einem abschließenden Schrägstrich / Endet, wird dies als Verzeichnis betrachtet und der Inhalt von <src> Wird unter <dest>/base(<src>) geschrieben. .

  • Wenn <dest> Nicht mit einem abschließenden Schrägstrich endet, wird es als reguläre Datei betrachtet und der Inhalt von <src> Wird unter <dest> Geschrieben.

Sie müssen also COPY test.txt /usr/src/app/ Mit einem abschließenden / Schreiben.

28
jwodder

Für mich habe ich einen Pfad hinzugefügt, der auf dem docker-compose.yml Anstelle des Dockerfile basiert:

Dateistruktur

.
..
/docker-compose.yml
/docker/
/docker/php/
/docker/php/Dockerfile
/docker/php/my_file

und in / habe ich docker-compose up --build ausgeführt.

anstelle von COPY docker/php/my_file /some/location musste ich COPY my_file /some/location ausführen

0
Steve Tauber