Frage Docker COPY-Problem - "keine solche Datei oder Verzeichnis"


In meiner Dockerfile habe ich die folgende 'COPY' Anweisung:

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

Es sollte selbstverständlich sein, dass es in meinem Host-System unter dem Verzeichnis "/ srv / visitor" tatsächlich meinen Quellcode gibt:

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

Jetzt, wenn ich versuche, ein Bild mit dieser Docker-Datei zu erstellen, hängt es bei dem Schritt, wenn das "COPY" passieren soll:

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

Es besagt, dass es kein solches Verzeichnis gibt, aber da ist es eindeutig.

Irgendwelche Ideen?

UPDATE 1:

Es wurde auf mich hingewiesen, dass ich mich geirrt habe, in der Art, wie ich den Aufbaukontext verstand. Der Vorschlag bestand darin, die "COPY" -Anweisung zu ändern:

COPY . /srv/visitor

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

RUN npm install

Es wurde etwas in Richtung "keine Paket.json Datei gefunden" angegeben, wenn es eindeutig eins gibt.

UPDATE 2:

Ich habe versucht, es mit dieser Änderung in der Dockerfile auszuführen:

COPY source /srv/visitor/

Es hielt an, als versucht wurde, npm zu laufen:

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

Also, wurde die Kopie durchgeführt? Wenn ja, warum kann npm package.json nicht finden?


34
2018-02-09 13:48


Ursprung


Für diejenigen, die 2017 nach einem Problem suchen - das könnte Ihr Problem sein github.com/docker/for-mac/issues/1922. Es empfiehlt, die Datei .dockerignore zu löschen und erneut zu testen. Wenn das funktioniert, können Sie mit den Einstellungen in .dockerignore experimentieren, um das Problem zu lösen. - Undefined


Antworten:


Aus der Dokumentation:

Das <src> Pfad muss im Kontext des Builds sein; Sie können COPY ../etwas / etwas 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 /srv/visitor Sie verwenden einen absoluten Pfad außerhalb des Buildkontexts, auch wenn es sich tatsächlich um das aktuelle Verzeichnis handelt.

Sie organisieren Ihren Build-Kontext besser so:

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

Und benutzen:

COPY resources /srv/visitor/

31
2018-02-09 13:57



Ich bin bereits im "/ srv / visitor" -Verzeichnis meines Host-Systems und der gesamte Quellcode und die Docker-Datei sind hier. Wie sollte ich meine "COPY" -Anweisung schreiben, damit diese Quelle in das Verzeichnis "/ srv / visitor" des Containers kopiert wird? - dsljanus
@dsljanus Das Quellverzeichnis oder die Datei muss sein relativ zum Aufbaukontext, d.h. /srv/visitor Verzeichnis. - 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
@dsljanus Und woher rennst du dann npm? Poste deine gesamte Docker-Datei ... Btw ändere nicht mehrere Updates wie diese in Fragen, das ist wirklich nervig, um von einem Problem zu einem ganz anderen zu springen. Der Zweck von SF besteht darin, klare Fragen zu stellen, um klare Antworten zu erhalten. - Xavier Lucas
@dsljanus Ok, das ist das Problem, nicht verwenden RUN cd aber benutze es WORKDIR Daher wird das aktuelle Verzeichnis zwischen den einzelnen Schritten gespeichert. Eine Dockerdatei ist nicht mehr als ein Wrapper für Docker Run + Docker Commit, so dass jeder Schritt unabhängig von der vorherigen Ebene ausgeführt wird. Das bedeutet, dass pwd gleich ist / in jedem Schritt, wenn Sie diese Anweisung nicht verwenden. - Xavier Lucas


Für mich war das Verzeichnis im richtigen Kontext, nur war es in der (versteckten) enthalten .dockerignore Datei im Stammverzeichnis des Projekts. Dies führt zu der Fehlermeldung:

lstat mydir/myfile.ext: no such file or directory

37
2018-05-10 15:11



du meintest .dockerignore? das ist mir gerade passiert - Martín Coll
Gesundheit! Hatte ein ganzes Verzeichnis ignoriert, das ich vergessen habe und es hat meinen Build kaputt gemacht. Als kleine Anmerkung können Sie eine einzelne Datei in einem Verzeichnis mit folgenden Elementen ignorieren: !path/to/my/fileselbst wenn path ist in .dockerignore. - hjc1710
Mir ist das auch gerade passiert. Vielen Dank! - Matthew Adams
Das ist ein guter. - Gudlaugur Egilsson
Ich kann Ihnen nicht sagen, wie dankbar ich Ihnen dafür bin. Ich habe mich den ganzen Tag gefoltert. Ich verstehe immer noch nicht, warum VS Tools for docker ein .dockerignore mit * darin enthalten - bilal.haider


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

Von dem Dokumentation Hinweis: Wenn Sie mit STDIN erstellen (docker build - < somefile), es gibt keinen Build-Kontext, daher kann COPY nicht verwendet werden.


6
2017-12-15 02:36





Wie Xavier Lucas [extrem hilfreich] Antwort angegeben hat, können Sie COPY oder ADD nicht aus einem Verzeichnis außerhalb Ihres Buildkontexts verwenden (der Ordner, in dem Sie "docker build" ausführen, sollte dasselbe Verzeichnis wie Ihre .Dockerdatei sein). Selbst wenn Sie versuchen, einen Symlink zu verwenden, wird es nicht funktionieren.

Hinweis: Dies ist spezifisch für POSIX (Linux, Unix, Mac, möglicherweise Linux-Subsystem für Windows).   Sie können in Windows unter Verwendung von JUNCTION möglicherweise ä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 die   Wirt. Das willst du fast nie! Mit Vorsicht behandeln.

Anwendung: Lernen, Experimentieren in einer Entwicklungsumgebung

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


1
2018-03-20 17:17



Mein Ziel: Kopieren Sie zwischengespeicherte Pakete in meinem lokalen Dateisystem in mein Docker-Image. Installieren Sie die benötigten Tools (entweder den Cache oder laden Sie ihn neu). Dann lösche ich diesen Cache im Bild und lösche die Hard-Links auf dem Host. Wenn der Host diese Dateien nicht hat, keine Sorgen. Aber ich habe begrenzte Bandbreite und begrenzten Speicherplatz. Ist das eine akzeptable Verwendung? - TamusJRoyce


Ich stieß auf dieses Problem und fand heraus, dass ich in der Lage war, der Build-Variable einen Kontext hinzuzufügen, um meine Dockerfiles aus anderen Verzeichnissen zu laden. Dies erlaubte mir, meine Standard-Docker-Dateistruktur ein bisschen mehr nach meinem Geschmack zu ändern. Hier ist ein Ausschnitt von meinem docker-compose.yml:

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

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

Hoffe das hilft!


1
2017-07-27 18:44





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


0
2017-10-23 03:28





Für den folgenden Fehler,

COPY failed: stat

Ich habe es geschafft, indem ich den Andockdienst neu gestartet habe.


0
2017-07-12 07:03





Ich löste dieses Problem schließlich in meinem Fall war Dockerfile, die Kopie in einer tieferen Ebene des Projekts ausgeführt wurde. So erkannte ich, dass der Build-Pfad des Hosts relativ zum Dateispeicherort der Docker-Datei ausgedrückt wird.


0
2017-08-24 13:22





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

Ich hatte das COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directory und es gelang, dies zu beheben, indem Sie die Andock-Datei angeben.

Laufen docker build . -f docker/development/Dockerfile hat funktioniert.

Aber rennen Runningdocker build docker / development / Dockerfile verursachte dieses Problem.

-f oder --file um den Namen und den Ort des Dockerfile.

Es fand es zunächst seltsam, denn als ich das hatte Dockerfile im apps root-Verzeichnis hat es funktioniert. Dies wird hilfreich sein, wenn Sie die Dockerdateien Ihrer Umgebung ein wenig besser verwalten möchten.


0
2017-11-11 17:31





Für mich war es ein Problem mit dem Google Cloud SDK:

https://code.google.com/p/google-cloud-sdk/issues/detail?id=1431


-1
2018-01-03 15:16