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?

GreenGodot
quelle
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 .
askb
quelle
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.

Swateek
quelle
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

Popeye
quelle
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.

Tallandtree
quelle
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.

Ein Stern
quelle
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.

LiHRaM
quelle
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.

Fufonzo
quelle
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

Anna van den Akker
quelle
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
Vineeth
quelle
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(...)
Metadaten
quelle
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.

linehrr
quelle
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.

Himbeere
quelle
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

Walterwhites
quelle
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/
Isaac Pak
quelle
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

Jose Solorzano
quelle
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.

TSlegaitis
quelle
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]

Omr
quelle
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.

Algojohn
quelle
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

Himmel
quelle
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
Aleksandras Urbonas
quelle