Eine Datei in eine Docker-Datei kopieren, keine solche Datei oder kein solches Verzeichnis?


93

Ich habe eine Docker-Datei in meinem Stammordner (~) eingerichtet. Die ersten drei Zeilen meiner Datei sehen folgendermaßen aus:

COPY file1 /root/folder/
COPY file2 /root/folder/
COPY file3 /root/folder/

Es wird jedoch für jede Zeile der folgende Fehler zurückgegeben:

Keine übereinstimmende Datei oder Ordner

Die Dateien befinden sich im selben Verzeichnis wie meine Docker-Datei und ich führe den Befehl auch docker build - < Dockerfileim Terminal im selben Verzeichnis aus.

Was mache ich hier genau falsch?


Ich hatte dieses Problem und bemerkte dann, dass die .dockerignore-Datei die Datei ignorierte, die ich kopieren wollte. Lösung von jinschubert: github.com/docker/for-mac/issues/1922
JStrahl

Antworten:


35

Die Anweisung COPY in Dockerfilekopiert die Dateien in srcden destOrdner. Sieht aus wie Sie fehlen entweder die file1, file2und file3oder versuchen , das zu bauen , Dockerfileaus dem falschen Ordner.

Siehe Dockerfile Doc

Auch der Befehl zum Erstellen des Dockerfilesollte so etwas wie sein.

cd into/the/folder/
docker build -t sometagname .

3
Dieser zweite Befehl schlägt für mich fehl und besagt, dass "build" ein Argument erfordert.
GreenGodot

oh - aktualisiere das cmd jetzt, es ist nicht erforderlich, die Docker-Datei zu erwähnen.
Askb

3
Nachdem ich Ihren Link richtig gelesen hatte, stellte ich fest, dass sich die Docker-Datei überhaupt nicht im Stammordner befinden sollte. Alles in das Unterverzeichnis verschoben, den Befehl build ausgeführt und ausgeführt. Ihre Antwort war sehr hilfreich, daher werde ich sie als richtig markieren.
GreenGodot

47
Überprüfen Sie auch, ob eine Docker Ignore-Datei vorhanden ist (nicht).
Tony

247

Überprüfen Sie auch die .dockerignoreDatei.

Ich weiß, dass dies ein sehr seltener Fall ist, aber ich hatte diese Datei dort erwähnt.


3
Oh mein Gott, danke. Ich habe den Namen eines Java-Projekts (und damit des Artefakts und des Build- ripgrepVerzeichnisses) geändert und nicht in Punktedateien gesucht, sodass ich den letzten lästigen Verweis auf das alte Verzeichnis nicht gesehen habe.
Martin Lehmann

4
Vielen Dank für das Headsup. In meinem Fall habe ich den Visual Studio-Assistenten für Docker verwendet und in der ersten Zeile einen .dockerignore mit * hinzugefügt :(
lacripta

Aus irgendeinem Grund enthält mein Standard-Dockerignore ** \ bin. Ich bin sicher, dass es vom Docker-Desktop generiert wurde.
Steve Smith

ahhghgghghg scheint doch kein so seltener Fall zu sein !!!. Hätte es in einer Million Jahren nicht herausgefunden. Das Verzeichnis wurde vor einiger Zeit hinzugefügt und total vergessen. Der Grund für das Hinzufügen ist, dass es jeden Build extrem langsam macht, denke, es hat mit Git zu tun ...
Tahiche

1
Oh im Ernst, was für ein Fehler ist das. Vielen Dank für den Hinweis!
TaiBsu

36

Möglicherweise wird dies dadurch verursacht, dass Sie file1 / file2 / file3 als absoluten Pfad bezeichnen, der sich nicht im Build-Kontext befindet. Docker sucht den Pfad nur im Build-Kontext.

Wenn Sie beispielsweise COPY / home / yourname / file1 verwenden, interpretiert Docker build es als $ {Docker-Build-Arbeitsverzeichnis} / home / yourname / file1. Wenn hier keine Datei mit demselben Namen vorhanden ist, wird kein Datei- oder Verzeichnisfehler ausgegeben.

Siehe Eines der Docker-Probleme


Es gibt eine Art absolutes Pfadproblem, ich kann nur "relativ / Pfad / x KOPIEREN". Ich kann nicht "COPY / absolute / path / y.", Weiß jemand warum?
Alexander Mills

8
@AlexanderMills Dockerfiles sollen unabhängig auf dem Host-Computer ausgeführt werden können und mit zusätzlichen Dateien geliefert werden, die in Pfaden relativ zu Dockerfile verfügbar sind. Wenn Sie absolute Pfade verwenden, kann es nur auf Ihrem Computer ausgeführt werden.
Kciesielski

Das war auch mein Problem mit der ADDRichtlinie, danke.
Vmonteco

Das wusste ich nicht. Das Ändern so, dass die Datei neben der Docker-Datei enthalten war, funktionierte für mich perfekt. Wenn ich es von einem anderen Quellspeicherort hatte (als vollständiger Pfad, z. B. / dir / dir2 / file), funktionierte es nicht. Es funktioniert, wenn es sich in einem Verzeichnis als Docker-Datei befindet oder
untergeordnete Elemente

21

Scheint, dass die Befehle:

docker build -t imagename .

und:

docker build -t imagename - < Dockerfile2

werden nicht auf die gleiche Weise ausgeführt. Wenn Sie mit Dockerfile und Dockerfile2 zwei Docker-Images aus einem Ordner erstellen möchten, kann der Befehl COPY im zweiten Beispiel nicht mit stdin (<Dockerfile2) verwendet werden. Stattdessen müssen Sie verwenden:

docker build -t imagename -f Dockerfile2 .

Dann funktioniert COPY wie erwartet.


16

Das Ausführen hat docker build . -f docker/development/Dockerfilefunktioniert, sodass Sie Ihre Docker-Datei aus einem anderen Verzeichnis als dem Stammverzeichnis Ihrer Anwendung ausführen können.

Verwenden Sie -foder --file, um den Namen und den Speicherort des anzugeben Dockerfile.

Dies ist mir passiert, als ich versucht habe, die Docker-Datei aus einem anderen Verzeichnis auszuführen.

Ich hatte das COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directoryund schaffte es, dies durch Angabe der Docker-Datei zu beheben.

Es war das docker build docker/development/Dockerfile, was dieses Problem für mich verursacht hat.

Ich fand es zuerst seltsam, weil Dockerfilees gut funktionierte, als ich das im Apps-Stammverzeichnis hatte. Dies ist hilfreich, wenn Sie die Docker-Dateien Ihrer Umgebung etwas besser verwalten möchten.


1
docker build . -f docker/development/Dockerfiledas funktioniert
Pradeep Surale

1
Vielen Dank - das hat auch bei mir funktioniert. Es hat mich verrückt gemacht.
14.

4

Ich habe gerade dieses Problem erlebt und keiner der Vorschläge hier hat mein Problem gelöst. Es stellte sich heraus, dass ich die falschen Zeilenenden in meiner Datei hatte und sie in die entsprechenden Zeilenenden ändern musste. (In diesem Fall von CRLF zu LF, sodass Ubuntu 14.04 das Skript erkennt, das ich unter Windows bearbeitet habe.)

Ich habe die Zeilenenden mit VSCode geändert, und die meisten Code-Editoren sollten die Möglichkeit haben, Zeilenenden auszuwählen.

Hoffe das hilft jemandem.


Ja, es hat geholfen :)
Robert Smith

3

Ich fühle mich ein wenig dumm, aber mein Problem war, dass ich Docker-Compose ausgeführt habe und meine Docker-Datei sich in einem ./deploy-Unterverzeichnis befand. Meine ADD-Referenz musste relativ zum Stammverzeichnis des Projekts sein, nicht zur Docker-Datei.

Geändert: ADD ./file.tar.gz / etc / folder / in: ADD ./deploy/file.tar.gz / etc / folder /

Jedenfalls dachte ich, ich würde posten, falls jemand auf dasselbe Problem stößt.


3

Hier ist die Lösung und die beste Vorgehensweise:

Sie müssen einen Ressourcenordner erstellen, in dem Sie alle zu kopierenden Dateien aufbewahren können.

├── Dockerfile
│   └── resources
│       ├── file1.txt
│       ├── file2.js

Der Befehl zum Kopieren von Dateien sollte folgendermaßen angegeben werden:

COPY resources /root/folder/

wo

* resources - Ihr lokaler Ordner, den Sie in demselben Ordner erstellt haben, in dem sich Dockerfile befindet

* / root / folder / - Ordner in Ihrem Container


1

Für folgenden Fehler:

COPY failed: stat /<**path**> :no such file or directory

Ich habe es durch einen Neustart des Docker-Dienstes umgangen.

sudo service docker restart

1

Datei nicht gefunden Fehler mit Docker put_archive. Ich verwende die Python-API für Docker. Docker Version 1.12.5, Build 7392c3b

docker.errors.NotFound: 404 Client Error: Not Found ("lstat /var/lib/docker/aufs/mnt/39d58e00519ba4171815ee4444f3c43d2c6a7e285102747398f6788e39ee0e87/var/lib/neo4j/certificates: no such file or directory")

Ich kann keine Dateien in einen erstellten Docker-Container kopieren.

con = cli.create_container(...)
cli.put_archive(...)
cli.start(con['Id'])

Wenn ich die Betriebsreihenfolge ändere, tritt kein Fehler auf und die Dateien werden genau dorthin kopiert, wo ich sie haben möchte. Ich weiß also, dass mein Code funktioniert und das tut, was ich möchte. Es ist jedoch wichtig, Konfigurationsdateien in einen Container zu kopieren, bevor er gestartet wird. Durch das Kopieren der Dateien nach dem Start wird der Container so gestartet, dass er mit einer Standardkonfiguration beginnt und nicht mit der benutzerdefinierten Konfiguration, die vor dem Start des Containers kopiert werden muss. Docker behauptet, dass dieses Problem geschlossen ist, aber meine Anwendung weiterhin betrifft.

Das funktioniert; Gleicher Code unterschiedliche Ausführungsreihenfolge.

con = cli.create_container(...)
cli.start(con['Id'])
cli.put_archive(...)

1

Wenn Sie sicher sind, dass Sie das Richtige getan haben, sich Docker aber immer noch beschwert, werfen Sie einen Blick auf dieses Problem: https://github.com/moby/moby/issues/27134 .
Ich habe mich davon verbrannt und es scheint, als würde ein Neustart der Docker-Engine service docker restartdieses Problem nur beheben.


1

Ich suchte nach einer Lösung für dieses Problem und der Ordner, den ich HINZUFÜGEN oder KOPIEREN wollte, befand sich nicht im Build-Ordner, in mehreren Verzeichnissen oben oder in /

Das Verschieben des Ordners von außerhalb des Build-Ordners in den Build-Ordner hat mein Problem behoben.


1

Eine Möglichkeit, stdin nicht zu verwenden und den Kontext beizubehalten, ist:

1) In Ihrer Docker-Datei sollten Sie hinzufügen

ADD /your_dir_to_copy /location_in_container

2) Danach sollten Sie auf das übergeordnete Verzeichnis / your_dir_to_copy gehen

2) Führen Sie dann diesen Befehl aus

sudo docker build . -t (image/name) -f path_of_your_dockerfile/Dockerfile

3) nachdem Sie Ihren Container erstellt haben

docker run -ti --rm cordova bash

4) Nachdem Sie Ihr Verzeichnis in Ihren Container kopiert haben


1

Frühere Aufrufe von COPY ändern möglicherweise das Verzeichnis.

COPY ./server/package.json ./server      # this passes, but the dest ./server is considered a file

COPY ./server/dist ./server/dist         # error, ./server/dist is not a directory

Fügen Sie dem ersten Aufruf einen abschließenden Schrägstrich hinzu

COPY ./server/package.json ./server/

1

Ich bin darauf gestoßen. Das Kopieren einiger Verzeichnisse hat nicht funktioniert. Das Kopieren von Dateien hat funktioniert. Es stellte sich heraus, dass in .gitignore enthaltene Dateien (nicht nur .dockerignore) ebenfalls ignoriert werden. Siehe: https://github.com/zeit/now/issues/790


Dutzende von Referenzen für COPY, die nicht kopiert werden konnten - dies ist eine der wenigen, die .dockerignoreals Täter bezeichnet werden
Alvin

1

Ich weiß, dass dies alt ist, aber etwas, worauf ich hinweisen muss. Wenn Sie denken, dass alles so ist, wie es soll, überprüfen Sie Ihre .gitignore-Datei :)

Möglicherweise haben Sie den Ordner lokal, aber wenn der Ordner in Ihrem Git ignoriert wird, befindet er sich nicht auf dem Server. Dies bedeutet, dass Docker diesen Ordner nicht finden kann, da er nicht vorhanden ist.


1

Ähnlich und dank der Antwort von Tslegaitis nach

gcloud builds submit --config cloudbuild.yaml . 

es zeigt

Check the gcloud log [/home/USER/.config/gcloud/logs/2020.05.24/21.12.04.NUMBERS.log] to see which files and the contents of the
default gcloudignore file used (see `$ gcloud topic gcloudignore` to learn
more).

Wenn Sie dieses Protokoll überprüfen, wird vom Docker Folgendes verwendet .gitignore:

DATE Using default gcloudignore file:
# This file specifies files that are *not* uploaded to Google Cloud Platform
# using gcloud. It follows the same syntax as .gitignore, with the addition of
# "#!include" directives (which insert the entries of the given .gitignore-style
# file at that point).
# ...

.gitignore

Also habe ich meine behoben .gitignore(ich verwende sie stattdessen als Whitelist) und Docker hat die Datei kopiert.

[Ich habe die Antwort hinzugefügt, weil ich nicht genug Ruf habe, um einen Kommentar abzugeben]


1

Ich hatte dieses Problem, obwohl sich mein Quellverzeichnis im richtigen Build-Kontext befand. Der Grund dafür war, dass mein Quellverzeichnis eine symbolische Verknüpfung zu einem Speicherort außerhalb des Erstellungskontexts war.

Zum Beispiel enthält meine Docker-Datei Folgendes:

COPY dir1 /tmp

Wenn dir1es sich um eine symbolische Verknüpfung COPYhandelt, funktioniert der Befehl in meinem Fall nicht.


0

Das ist also erst kürzlich ein paar Mal passiert. Als .NET-Entwickler habe ich mit VisualStudio meinen Build-Namen von SomeThingin Somethingals DLL-Namen geändert, aber dies ändert nichts an der verbleibenden .csproj-DateiSomeThing.csproj

Das Dockerfile verwendet Linux-Dateinamen, bei denen zwischen Groß- und Kleinschreibung unterschieden wird. Daher hat das neu automatisch generierte Dockerfile versucht, zu kopieren, Something.csprojwas nicht gefunden werden konnte. Wenn Sie diese Datei also manuell umbenennen (wodurch sie in Kleinbuchstaben geschrieben wird), funktioniert alles

Aber ... hier ist eine warnende Warnung. Diese Änderung des Dateinamens auf meinem Windows-Laptop wird von Git nicht erfasst, sodass sich die Repo-Quelle noch SomeThing.csprojim Repo befand. Während des CI / CD-Prozesses schlug der Docker-Build aus den gleichen Gründen fehl ...

Ich musste den Dateinamen direkt als Commit für das Repo ändern ... böse kleine Problemumgehung, brachte mich aber zum Laufen

tl; dr Wenn Sie unter Windows O / S die Groß- und Kleinschreibung des Dateinamens überprüfen und beachten, dass lokale Dateinamen nicht als Git-Änderung erfasst werden, stellen Sie sicher, dass Ihr Repo auch bei Verwendung von CI / CD geändert wird


0

Einige gute Antworten hier schon. Was für mich funktioniert hat, war, die Kommentare in die nächste Zeile zu verschieben.

SCHLECHT :

WORKDIR /tmp/app/src # set the working directory (WORKDIR), so we can reference program directly instead of providing the full path.
COPY src/ /tmp/app/src/ # copy the project source code

GUT :

WORKDIR /tmp/app/src
  # set the working directory (WORKDIR), so we can reference program directly instead of providing the full path.
COPY src/ /tmp/app/src/
  # copy the project source code
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.