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?
Antworten:
Aus der Dokumentation:
Wenn Sie verwenden, verwenden
/srv/visitor
Sie 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:
Und benutze:
Hinweis:
docker build - < Dockerfile
hat keinen Kontext.Verwenden Sie daher,
docker build .
quelle
/srv/visitor
Verzeichnis, sein.RUN cd
sondern verwenden,WORKDIR
damit 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.Für mich befand sich das Verzeichnis im richtigen Kontext, nur wurde es in die (versteckte)
.dockerignore
Datei im Stammverzeichnis des Projekts aufgenommen. Dies führt zur Fehlermeldung:quelle
.dockerignore
? das ist mir gerade passiert!path/to/my/file
auch wennpath
sich in befindet.dockerignore
.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.quelle
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.
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.
quelle
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:
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!
quelle
Für mich bestand das Problem darin, dass der Dateiname, den ich hinzufügte, ein nachgestelltes Leerzeichen aufwies. Ein Umbenennen hat es behoben.
quelle
Für folgenden Fehler
Ich habe es durch einen Neustart des Docker-Dienstes geschafft.
quelle
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.
quelle
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 directory
und schaffte es, dies durch Angabe der Docker-Datei zu beheben.Laufen hat
docker build . -f docker/development/Dockerfile
funktioniert.Das Ausführen von
Running
docker build docker / development / Dockerfile` verursachte dieses Problem.-f
oder--file
, um den Namen und den Ort derDockerfile
.Es fand es zunächst seltsam, denn als ich das
Dockerfile
im Stammverzeichnis der Apps hatte, funktionierte es einwandfrei. Dies ist hilfreich, wenn Sie die Docker-Dateien Ihrer Umgebung etwas besser verwalten möchten.quelle
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.quelle
Für mich war es ein Problem mit dem Google Cloud SDK:
https://code.google.com/p/google-cloud-sdk/issues/detail?id=1431
quelle