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 - < Dockerfile
im Terminal im selben Verzeichnis aus.
Was mache ich hier genau falsch?
Antworten:
Die Anweisung COPY in
Dockerfile
kopiert die Dateien insrc
dendest
Ordner. Sieht aus wie Sie fehlen entweder diefile1
,file2
undfile3
oder versuchen , das zu bauen ,Dockerfile
aus dem falschen Ordner.Siehe Dockerfile Doc
Auch der Befehl zum Erstellen des
Dockerfile
sollte so etwas wie sein.quelle
Überprüfen Sie auch die
.dockerignore
Datei.Ich weiß, dass dies ein sehr seltener Fall ist, aber ich hatte diese Datei dort erwähnt.
quelle
ripgrep
Verzeichnisses) geändert und nicht in Punktedateien gesucht, sodass ich den letzten lästigen Verweis auf das alte Verzeichnis nicht gesehen habe.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
quelle
ADD
Richtlinie, danke.Scheint, dass die Befehle:
und:
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:
Dann funktioniert COPY wie erwartet.
quelle
Das Ausführen hat
docker build . -f docker/development/Dockerfile
funktioniert, sodass Sie Ihre Docker-Datei aus einem anderen Verzeichnis als dem Stammverzeichnis Ihrer Anwendung ausführen können.Verwenden Sie
-f
oder--file
, um den Namen und den Speicherort des anzugebenDockerfile
.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 directory
und 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
Dockerfile
es gut funktionierte, als ich das im Apps-Stammverzeichnis hatte. Dies ist hilfreich, wenn Sie die Docker-Dateien Ihrer Umgebung etwas besser verwalten möchten.quelle
docker build . -f docker/development/Dockerfile
das funktioniertIch 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.
quelle
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.
quelle
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.
Der Befehl zum Kopieren von Dateien sollte folgendermaßen angegeben werden:
wo
* resources - Ihr lokaler Ordner, den Sie in demselben Ordner erstellt haben, in dem sich Dockerfile befindet
* / root / folder / - Ordner in Ihrem Container
quelle
Für folgenden Fehler:
Ich habe es durch einen Neustart des Docker-Dienstes umgangen.
quelle
Datei nicht gefunden Fehler mit Docker put_archive. Ich verwende die Python-API für Docker. Docker Version 1.12.5, Build 7392c3b
Ich kann keine Dateien in einen erstellten Docker-Container kopieren.
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.
quelle
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 restart
dieses Problem nur beheben.quelle
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.
quelle
Eine Möglichkeit, stdin nicht zu verwenden und den Kontext beizubehalten, ist:
1) In Ihrer Docker-Datei sollten Sie hinzufügen
2) Danach sollten Sie auf das übergeordnete Verzeichnis / your_dir_to_copy gehen
2) Führen Sie dann diesen Befehl aus
3) nachdem Sie Ihren Container erstellt haben
4) Nachdem Sie Ihr Verzeichnis in Ihren Container kopiert haben
quelle
Frühere Aufrufe von COPY ändern möglicherweise das Verzeichnis.
Fügen Sie dem ersten Aufruf einen abschließenden Schrägstrich hinzu
quelle
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
quelle
.dockerignore
als Täter bezeichnet werdenIch 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.
quelle
Ähnlich und dank der Antwort von Tslegaitis nach
es zeigt
Wenn Sie dieses Protokoll überprüfen, wird vom Docker Folgendes verwendet
.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]
quelle
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:
Wenn
dir1
es sich um eine symbolische VerknüpfungCOPY
handelt, funktioniert der Befehl in meinem Fall nicht.quelle
Das ist also erst kürzlich ein paar Mal passiert. Als .NET-Entwickler habe ich mit VisualStudio meinen Build-Namen von
SomeThing
inSomething
als 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.csproj
was nicht gefunden werden konnte. Wenn Sie diese Datei also manuell umbenennen (wodurch sie in Kleinbuchstaben geschrieben wird), funktioniert allesAber ... 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.csproj
im 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
quelle
Einige gute Antworten hier schon. Was für mich funktioniert hat, war, die Kommentare in die nächste Zeile zu verschieben.
SCHLECHT :
GUT :
quelle