Docker-KOPIERPROBLEM - "keine solche Datei oder kein solches Verzeichnis"

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

# Copy app codeCOPY /srv/visitor /srv/visitor

Es sollte selbstverständlich sein, dass sich in meinem Hostsystem im Verzeichnis "/ srv / visitor" tatsächlich mein Quellcode befindet:

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

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

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

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

Irgendwelche Ideen?

AKTUALISIERUNG 1:

Es wurde mir darauf hingewiesen, dass ich mich in der Art und Weise, wie ich den Kontext verstanden habe, geirrt habe. Der Vorschlag bestand darin, die Anweisung "KOPIEREN" in diese zu ändern:

COPY . /srv/visitor

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

RUN npm install

Es sagte etwas in der Art von "kein Paket.json-Datei gefunden", wenn es eindeutig eine gibt.

AKTUALISIERUNG 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 ae5e2a993e11npm ERR! install Couldn't read dependenciesnpm ERR! Linux 3.18.5-1-ARCHnpm ERR! argv "/usr/bin/node" "/usr/sbin/npm" "install"npm ERR! node v0.10.36npm ERR! npm  v2.5.0npm ERR! path /package.jsonnpm ERR! code ENOPACKAGEJSONnpm ERR! errno 34npm 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.logINFO[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 das Paket nicht finden.json?

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

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

Aus der Dokumentation :

Der <src> Pfad muss sich im Kontext des Builds befinden; sie können nicht KOPIEREN../something /something , weil 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 Build-Kontexts, 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 verwenden :

COPY resources /srv/visitor/

Beachten:

docker build - < Dockerfile hat keinen Kontext.

Daher verwenden,

docker build .

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

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

Ich bin auf dieses Problem gestoßen und habe herausgefunden, dass ich der Build-Variablen einen Kontext hinzufügen konnte, um meine Docker-Datei (en) aus anderen Verzeichnissen zu laden. Dies ermöglichte es mir, meine Standard-Docker-Dateistruktur ein wenig mehr nach meinen Wünschen zu ändern. Hier ist ein Ausschnitt aus meinem 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. Sie können hier auf die Docker-Dokumente verweisen: https://docs.docker.com/compose/compose-file/#context

Hoffe das hilft!

Wie Xavier Lucas [äußerst hilfreiche] Antwort angegeben hat, 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 dasselbe Verzeichnis sein wie Ihr.Docker-Datei). Selbst wenn Sie versuchen, einen Symlink zu verwenden, funktioniert dies nicht.

Hinweis: Dies ist spezifisch für POSIX (Linux, Unix, Mac, möglicherweise Linux-Subsystem für Windows). Möglicherweise können Sie in Windows mit JUNCTION Ähnliches tun.

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

Achtung: Wenn Sie dies verwenden, wird Ihr Docker-Projekt für den Host spezifisch. Sie wollen das fast nie tun! Vorsichtig behandeln.

Anwendung: Lernen, Experimentieren in einer Entwicklungsumgebung

Das hat den Trick für mich gemacht. 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", um es zu entfernen.

Für folgenden Fehler,

COPY failed: stat

Ich habe es geschafft, indem ich den Docker-Dienst neu gestartet habe.

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

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

Laufen docker build . -f docker/development/Dockerfile arbeitete.

Aber laufen Runningdocker build docker / development ` Dockerfile' hat dieses Problem verursacht.

-f oder --file so geben Sie den Namen und den Speicherort des Dockerfile.

Es fand es zuerst seltsam, denn als ich das hatte Dockerfile im Stammverzeichnis der Apps hat es gut funktioniert. Dies hilft, wenn Sie Ihre Umgebungs-Docker-Dateien etwas besser verwalten möchten.

Für alle, die interessiert sind, .gitignore kann auch das Problem verursachen. In meinem Fall Garn.sperre wurde ignoriert. Und es warf einen ähnlichen Fehler.

Für mich war das Problem, dass der Dateiname, den ich hinzufügte, ein nachgestelltes Leerzeichen hatte. Eine Umbenennung hat es behoben.

Ich habe dieses Problem endlich gelöst, in meinem Fall war Dockerfile, das copy ausführt, in einer tieferen Ebene der project.So Mir wurde klar, dass der Build-Pfad des Hosts relativ zum Dateispeicherort der Docker-Datei ausgedrückt wird.

Für diejenigen, die 2017 nach einem Problem suchen - dies könnte Ihr Problem sein /var/lib/docker/tmp/docker-builderXXXXXXX/... no such file or directory · Issue #1922 · docker/for-mac · GitHub . es wird empfohlen, Sie zu löschen .dockerignore-Datei und erneutes Testen. Wenn das funktioniert, können Sie an Ihren Einstellungen herumspielen.dockerignore, um das Problem zu beheben.