Docker COPY-Problem - "Keine solche Datei oder kein solches Verzeichnis"

36

In meiner Docker-Datei habe ich die folgende "COPY" -Anweisung:

# Copy app code
COPY /srv/visitor /srv/visitor

Es versteht sich von selbst, dass in meinem Host-System im Verzeichnis "/ srv / visitor" tatsächlich mein Quellcode vorhanden ist:

[root@V12 visitor]# ls /srv/visitor/
Dockerfile  package.json  visitor.js

Wenn ich jetzt versuche, ein Image mit dieser Docker-Datei zu erstellen, bleibt es bei dem Schritt hängen, bei dem das "KOPIEREN" stattfinden soll:

Step 10 : COPY /srv/visitor /srv/visitor
INFO[0155] srv/visitor: no such file or directory

Es heißt, dass es ein solches Verzeichnis nicht gibt, es aber eindeutig gibt.

Irgendwelche Ideen?

UPDATE 1:

Es wurde mir gezeigt, dass ich mich geirrt habe, wie ich den Kontext verstanden habe. Der Vorschlag lief darauf hinaus, die "COPY" -Anweisung dahingehend zu ändern:

COPY . /srv/visitor

Das Problem ist, dass ich es so gemacht habe und der Build-Prozess im nächsten Schritt angehalten wurde:

RUN npm install

Es sagte etwas in der Art von "no package.json file found" (keine package.json-Datei gefunden), wenn es eindeutig eine gibt.

UPDATE 2:

Ich habe versucht, es mit dieser Änderung in der Docker-Datei auszuführen:

COPY source /srv/visitor/

Es wurde angehalten, als versucht wurde, npm auszuführen:

Step 12 : RUN npm install
 ---> Running in ae5e2a993e11
npm ERR! install Couldn't read dependencies
npm ERR! Linux 3.18.5-1-ARCH
npm ERR! argv "/usr/bin/node" "/usr/sbin/npm" "install"
npm ERR! node v0.10.36
npm ERR! npm  v2.5.0
npm ERR! path /package.json
npm ERR! code ENOPACKAGEJSON
npm ERR! errno 34

npm ERR! package.json ENOENT, open '/package.json'
npm ERR! package.json This is most likely not a problem with npm itself.
npm ERR! package.json npm can't find a package.json file in your current directory.

npm ERR! Please include the following file with any support request:
npm ERR!     /npm-debug.log
INFO[0171] The command [/bin/sh -c npm install] returned a non-zero code: 34

Wurde der Kopiervorgang durchgeführt? Wenn ja, warum kann npm package.json nicht finden?

dsljanus
quelle
Für diejenigen, die 2017 eine Ausgabe suchen - dies könnte Ihre Ausgabe sein github.com/docker/for-mac/issues/1922 . Es wird empfohlen, die .dockerignore-Datei zu löschen und erneut zu testen. Wenn das funktioniert, können Sie mit Ihren Einstellungen in .dockerignore experimentieren, um das Problem zu beheben.
Undefined

Antworten:

35

Aus der Dokumentation:

Der <src>Pfad muss sich im Kontext des Builds befinden . Sie können ../something / something nicht KOPIEREN, da der erste Schritt eines Docker-Builds darin besteht, das Kontextverzeichnis (und die Unterverzeichnisse) an den Docker-Daemon zu senden.

Wenn Sie verwenden, verwenden /srv/visitorSie einen absoluten Pfad außerhalb des Erstellungskontexts, auch wenn es sich tatsächlich um das aktuelle Verzeichnis handelt.

Sie organisieren Ihren Build-Kontext besser wie folgt:

├── /srv/visitor
│   ├── Dockerfile
│   └── resources
│       ├── visitor.json
│       ├── visitor.js

Und benutze:

COPY resources /srv/visitor/

Hinweis:

docker build - < Dockerfile hat keinen Kontext.

Verwenden Sie daher,

docker build .

Xavier Lucas
quelle
Ich befinde mich bereits im Verzeichnis "/ srv / visitor" meines Host-Systems, und mein gesamter Quellcode sowie die Docker-Datei befinden sich hier. Wie soll ich meine "COPY" -Anweisung schreiben, damit all diese Quellen in das "/ srv / visitor" -Verzeichnis des Containers kopiert werden?
dsljanus
1
@dsljanus Das Quellverzeichnis oder die Quelldatei muss relativ zum Build-Kontext, dh zum /srv/visitorVerzeichnis, sein.
Xavier Lucas
Also sollte es "." Sein? Weil ich es so hatte und der Build-Prozess im nächsten Schritt angehalten wurde, "RUN npm install". Es sagte etwas in der Art von "no package.json file found". Bitte beachten Sie auch mein Update.
Dsljanus
2
@dsljanus Und woher rennst du npm? Veröffentlichen Sie Ihre gesamte Docker-Datei ... Übrigens ändern Sie nicht mehrere Updates wie dieses in Fragen, es ist wirklich ärgerlich, von einem Problem zu einem völlig anderen zu springen. Der Zweck von SF ist es, klare Fragen zu stellen, um klare Antworten zu erhalten.
Xavier Lucas
1
@dsljanus Ok, das ist das Problem. Nicht verwenden, RUN cdsondern verwenden, WORKDIRdamit das aktuelle Verzeichnis zwischen den einzelnen Schritten gespeichert wird. Eine Docker-Datei ist nur ein Wrapper für docker run + docker commit, sodass jeder Schritt unabhängig von der vorherigen Ebene ausgeführt wird. Dies bedeutet, dass pwd /in jedem Schritt gleich ist, wenn Sie diese Anweisung nicht verwenden.
Xavier Lucas
39

Für mich befand sich das Verzeichnis im richtigen Kontext, nur wurde es in die (versteckte) .dockerignoreDatei im Stammverzeichnis des Projekts aufgenommen. Dies führt zur Fehlermeldung:

lstat mydir/myfile.ext: no such file or directory
AlcaDotS
quelle
3
du meintest .dockerignore? das ist mir gerade passiert
Martín Coll
5
Gesundheit! Ich hatte ein ganzes Verzeichnis ignoriert, das ich vergessen hatte, und es hat meinen Build zerstört. Eine kleine Anmerkung: Sie können eine einzelne Datei in einem Verzeichnis mit: nicht ignorieren, !path/to/my/fileauch wenn pathsich in befindet .dockerignore.
hjc1710
Das ist ein guter.
Gudlaugur Egilsson
Ich kann nicht ausdrücken, wie dankbar ich Ihnen dafür bin, dass ich mich den ganzen Tag gefoltert habe. Ich kann es immer noch nicht verstehen, warum VS Tools für Docker einen .dockerignore mit * enthält
bilal.haider
7

Für mich war das Problem, dass ich benutzte docker build - < Dockerfile

Aus der Dokumentation Hinweis: Wenn Sie mit STDIN ( docker build - < somefile) erstellen , gibt es keinen Erstellungskontext, sodass COPY nicht verwendet werden kann.

Adam
quelle
1

Wie in der Antwort von Xavier Lucas [äußerst hilfreich] angegeben, können Sie COPY oder ADD nicht aus einem Verzeichnis außerhalb Ihres Build-Kontexts verwenden (der Ordner, aus dem Sie "docker build" ausführen, sollte sich in demselben Verzeichnis befinden wie Ihre .Docker-Datei). Selbst wenn Sie versuchen, einen Symlink zu verwenden, funktioniert dieser nicht.

Hinweis: Dies gilt speziell für POSIX (Linux, Unix, Mac, möglicherweise Linux-Subsystem für Windows). Möglicherweise können Sie in Windows mit JUNCTION ähnliche Aktionen ausführen.

cd ~/your_docker_project/
cp -al /subfolder/src_directory ./
echo "COPY src_directory /subfolder/" >> Dockerfile

Gefahr: Wenn Sie dies verwenden, wird Ihr Docker-Projekt für den Host spezifisch. Das willst du so gut wie nie! Mit Vorsicht behandeln.

Anwendung: Lernen, Experimentieren in einer Entwicklungsumgebung

Das hat den Trick für mich getan. cp -al kopiert die Verzeichnisstruktur und erstellt feste Verknüpfungen für alle Dateien. Wenn Sie fertig sind, führen Sie "rm -rf ./src_directory" aus, um es zu entfernen.

TamusJRoyce
quelle
Mein Ziel: Kopieren von zwischengespeicherten Paketen auf meinem lokalen Dateisystem in mein Docker-Image. Installieren Sie die benötigten Tools (entweder wird der Cache verwendet oder es wird neu heruntergeladen). Dann lösche ich diesen Cache im Bild und lösche die Hardlinks auf dem Host. Wenn der Host diese Dateien nicht hat, keine Sorge. Aber ich habe eine begrenzte Bandbreite und begrenzten Speicherplatz. Ist das eine akzeptable Verwendung?
TamusJRoyce
1

Ich bin auf dieses Problem gestoßen und habe festgestellt, dass ich der Build-Variablen einen Kontext hinzufügen kann, um meine Docker-Dateien aus anderen Verzeichnissen zu laden. Dadurch konnte ich meine Standard-Docker-Dateistruktur ein wenig mehr nach meinen Wünschen ändern. Hier ist ein Ausschnitt aus meiner docker-compose.yml:

version: '3'
services:
  webserver:
    build:
      context: .
      dockerfile: ./server/Dockerfile
    ...

Durch Hinzufügen des Kontexts konnte ich definieren, wo auf die Dateien verwiesen werden soll. Auf die Docker-Dokumente können Sie hier verweisen: https://docs.docker.com/compose/compose-file/#context

Hoffe das hilft!

Ron
quelle
0

Für mich bestand das Problem darin, dass der Dateiname, den ich hinzufügte, ein nachgestelltes Leerzeichen aufwies. Ein Umbenennen hat es behoben.

Falkenauge
quelle
0

Für folgenden Fehler

COPY failed: stat

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

Vineeth
quelle
0

Ich habe dieses Problem endlich gelöst, in meinem Fall war Dockerfile, das eine Kopie ausführt, in einer tieferen Ebene des Projekts. Daher wurde mir klar, dass der Erstellungspfad des Hosts relativ zum Speicherort der Docker-Datei angegeben wird.

EmilianoPe
quelle
0

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

Ich hatte die 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.

Laufen hat docker build . -f docker/development/Dockerfilefunktioniert.

Das Ausführen von Runningdocker build docker / development / Dockerfile` verursachte dieses Problem.

-foder --file, um den Namen und den Ort der Dockerfile.

Es fand es zunächst seltsam, denn als ich das Dockerfileim Stammverzeichnis der Apps hatte, funktionierte es einwandfrei. Dies ist hilfreich, wenn Sie die Docker-Dateien Ihrer Umgebung etwas besser verwalten möchten.

Ein Stern
quelle
0

Die Datei muss sich nicht nur in einem Verzeichnis im aktuellen Erstellungskontext befinden, sondern kann auch keine weiche Verknüpfung zu einer Datei außerhalb des Erstellungskontexts sein.

Ich hatte eine Verknüpfung zu einer Datei in meinem Ausgangsverzeichnis und die Verknüpfung befand sich im Projektverzeichnis. Nachdem ich den Link gelöscht und die verknüpfte Datei in das Projekt ( rm mylink ; mv ~/myrealfile ./) verschoben habe , hat es funktioniert.

Loduwijk
quelle