Docker: Kontext kann nicht vorbereitet werden: Symlinks im Dockerfile-Pfad: GetFileAttributesEx können nicht ausgewertet werden

186

Ich habe heute Docker Toolbox für Windows 10 64bit heruntergeladen. Ich gehe das Tutorial durch. Beim Versuch, ein Image mit einer Docker-Datei zu erstellen, wird der folgende Fehler angezeigt.

Schritte:

  • Docker Quickstart-Terminal gestartet.
  • Testdocker nach dem Erstellen.
  • Bereiten Sie Dockerfile wie im Weblink "Erstellen Sie Ihr eigenes Bild" dokumentiert vor
  • lief unter Befehl

docker build -t docker-whale .

Error: $ docker build -t docker-whale .

unable to prepare context: unable to evaluate symlinks in Dockerfile path: GetFileAttributesEx C:\Users\Villanueva\Test\testdocker\Dockerfile: The system cannot find the file specified.

Übrigens: Ich habe verschiedene Optionen ausprobiert, die unter https://github.com/docker/docker/issues/14339 erwähnt wurden

    $ docker info
    Containers: 4
     Running: 0
     Paused: 0
     Stopped: 4
    Images: 2
    Server Version: 1.10.1
    Storage Driver: aufs
     Root Dir: /mnt/sda1/var/lib/docker/aufs
     Backing Filesystem: extfs
     Dirs: 20
     Dirperm1 Supported: true
    Execution Driver: native-0.2
    Logging Driver: json-file
    Plugins:
     Volume: local
     Network: bridge null host
    Kernel Version: 4.1.17-boot2docker
    Operating System: Boot2Docker 1.10.1 (TCL 6.4.1); master : b03e158 - Thu Feb 11 22:34:01 UTC 2016
    OSType: linux
    Architecture: x86_64
    CPUs: 1
    Total Memory: 996.2 MiB
    Name: default
    ID: C7DS:CIAJ:FTSN:PCGD:ZW25:MQNG:H3HK:KRJL:G6FC:VPRW:SEWW:KP7B
    Debug mode (server): true
     File Descriptors: 32
     Goroutines: 44
     System Time: 2016-02-19T17:37:37.706076803Z
     EventsListeners: 0
     Init SHA1:
     Init Path: /usr/local/bin/docker
     Docker Root Dir: /mnt/sda1/var/lib/docker
    Labels:
     provider=virtualbox
villanux
quelle
4
Update: Docker Build -t XXX --file ./Dockefile. hat funktioniert. Docker möchte möglicherweise die Dokumentation für Windows-Benutzer aktualisieren.
Villanux
4
Wenn docker build -t XXX --file ./Dockefilees sein könnte, weil Sie den Dateinamen falsch verstanden haben, fehlt der R.
eXa
17
Dies ist eine erstaunlich schlechte Fehlermeldung, es bedeutet nur "Datei kann nicht geöffnet werden" - dasselbe gilt für Linux und MacOS.
RichVel
Wahnsinnig schlechte Fehlermeldung.
Begrenzte Versöhnung

Antworten:

204

während Sie den folgenden Befehl ausführen:

docker build -t docker-whale .

Überprüfen Sie, ob Dockerfile in Ihrem aktuellen Arbeitsverzeichnis vorhanden ist.

kalyani chaudhari
quelle
28
Vielen Dank. Mein Problem war, dass ich meine Docker-Datei im Editor erstellt und automatisch .txt an den Dateinamen angehängt hatte.
IanGSY
5
Sie können den Dockerfile-Namen auch explizit mit dem fFlag schreiben , wie in docker build -f Dockerfile-dev.yaml -t my_container .Dies kann nützlich sein, wenn Sie mehrere Dockerfile in Ihrem Projekt haben, beispielsweise eine pro Umgebung. Gleiches gilt für Docker-Compose. Das Einfügen in verschiedene Unterverzeichnisse funktioniert nicht, da context ( .) nicht übereinstimmt.
Sumi Straessle
1
@IanGSY Ich wünschte, ich könnte dir mehr Punkte dafür geben. Das war auch genau mein Problem!
K. Brafford
5
Notepad ist ein übermäßig böses Programm.
Per Lundberg
92

Es ist Schande!

Die Fehlermeldung ist irreführend. Das Problem hat eigentlich nichts mit Symlinks zu tun. Normalerweise kann Docker die Docker-Datei nicht finden , die beschreibt, .

Typische Gründe sind:

  • Dockerfile hat einen falschen Namen .
    Es muss aufgerufen werden Dockerfile. Wenn es heißt, zum Beispiel dockerfile, .Dockerfile,Dockerfile.txt oder andere, wird es nicht gefunden werden.
  • Dockerfile ist nicht im Kontext .
    Wenn Sie sagen docker build contextdir, muss sich die Docker-Datei in befinden contextdir/Dockerfile. Wenn Sie es haben, sagen Sie,./Dockerfile , wird es nicht gefunden.
  • Dockerfile existiert überhaupt nicht .
    Klingt albern? Nun, ich habe die obige Fehlermeldung von meinem GitLab CI erhalten, nachdem ich eine nette Docker-Datei geschrieben hatte, aber vergessen habe, sie einzuchecken. Dumm? Sicher. Unwahrscheinlich? Nein.

Es ist nicht die einzige Schande ...

Nicht nur diese eine Fehlermeldung ist vage und verwirrend. Im Allgemeinen finde ich einige der Docker-Konzepte und einen Großteil der Dokumentation semantisch ungenau.

Einer der wirklich schlechten Punkte ist der Begriff "Tag" (Stand August 2019). Je nachdem, wo Sie in der Dokumentation nachsehen, werden alle folgenden Dinge gesagt (mehr oder weniger klar):

  • Es gibt den tagBefehl, aber das von Ihnen angegebene Argument wird nicht als Tag oder Tag-Name bezeichnet, sondern als Bildname.
  • Ein Bildname besteht aus einem Bildnamen und einem Tag, die durch einen Doppelpunkt getrennt sind.
  • Im tagBefehlsargument ist der Tag-Name optional, der Bildname ist jedoch obligatorisch. Offensichtlich.
  • In den Worten der Dokumentationsseite:
    docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • Aber nicht der gesamte Bildname in diesem Bildnamen ist tatsächlich der Bildname, da dem Bildnamen ein Hostname vorangestellt werden kann.
  • Obwohl es manchmal , dass Hostname Teil wird ein Teil des Bildes Name.
  • In jedem Fall sollte ein Bild mit einem Hostnamen xin (oder früher, aber irgendwie magisch immer an seinem Bildnamen) auf diesem Host x(in einer Registrierung) leben. Wenn Sie auf ein solches Bild zugreifen möchten, müssen Sie diesen Namen mehr oder weniger mit dem Hostpräfix verwenden x.
  • Aber ein Bild mit diesem Namen kann auf jedem Host leben, nicht nur auf x, weil es das Bild "pusht"x ein separater Vorgang ist.
  • Diesen Namen in einer Docker-Bilderliste zu sehen, bedeutet also nicht viel, aber es wird sicherlich etwas andeuten. Manchmal falsch.
  • Übrigens: Habe ich Namespaces erwähnt? Sie können zwischen dem Hostnamen und dem Bildnamen im Bildnamen wechseln. Und sind auch Teil des Bildnamens oder nicht, je nachdem, wo Sie suchen.

Wenn Sie dadurch verwirrt sind, ist es nicht Ihre Schuld.

Ende des Geschwätzes.

Lutz Prechelt
quelle
Ich denke, dies wäre eine viel stärkere (und relevantere) Antwort ohne die 2. Hälfte.
Paul Gear
1
Tolle Antwort und danke für die Hintergrundinformationen
Leon
37

Wenn Sie unter Windows 8 arbeiten, verwenden Sie die Docker-Toolbox. Führen Sie im Verzeichnis mydockerbuild den folgenden Befehl aus, da Ihre Docker-Datei eine Textdatei ist

docker build -t docker-whale -f ./Dockerfile.txt .
Divyanshu sachdeva
quelle
3
Wenn Sie dies später tun müssen, liegt dies daran, dass Ihre Docker-Datei eine Erweiterung hat, während Docker dies standardmäßig nicht erwartet. Das manuelle Einstellen der Datei mit der Erweiterung fügt Kopfschmerzen hinzu, die Sie nicht benötigen. Sie sollten den Windows Explorer so einstellen, dass Erweiterungen angezeigt werden, und dann die Erweiterung entfernen.
Alex
Wenn Sie dem Tutorial "Erste Schritte" der Docker-Dokumentation folgen, verwenden Sie Folgendes:docker build -t friendlyhello -f ./Dockerfile.txt .
Mike Kellogg
Es ist wirklich eine schlechte Semantik, dass Sie auch den Dateinamen und den Dummy-Pfad angeben müssen. und / oder benenne deine Datei immer als Dockerfile .. :-(
myloginid
Das hat mir den Tag gerettet. Ich benutze übrigens einen Mac. Der Haken dabei ist jedoch, dass die Docker-Datei als reine Textdatei erstellt wurde. Danke Kumpel für die Hilfe.
Sachidananda Naik
23

Der Name der Datei sollte sein Dockerfileund nicht .Dockerfile. Die Datei sollte keine Erweiterung haben.

SharpCoder
quelle
14

Ich hatte meine Docker-Datei anstelle von Docker-Datei (groß geschrieben) benannt, und als ich das geändert hatte, begann sie mit der Verarbeitung meiner "Docker-Datei".

Alan Fitzgerald
quelle
14

Entfernen Sie einfach die Erweiterung .txt aus Dockerfile und führen Sie den Befehl aus

docker build -t image-name 

Es wird sicher funktionieren.

Satya
quelle
9

Ich habe diesen Fehler (in MacBook), obwohl ich den richtigen Befehl verwendet habe, um ein Bild zu erstellen.

docker build -t testimg .

Später fand ich, dass der Weg das Problem ist. Navigieren Sie einfach zum richtigen Pfad, der die Docker-Datei enthält. Überprüfen Sie einfach Ihr aktuelles Arbeitsverzeichnis. Keine Panik!

arunprakashpj
quelle
4

In Windows 10 ... ist Periode der erste Parameter

docker build . -t docker-whale

PDA
quelle
8
nicht mehr (wenn überhaupt) docker build -t docker-whale .ist ein gültiger Befehl
sebagomez
4

Das liegt nur daran, dass Notepad am Ende von Dockerfile ".txt" hinzufügt

Aurélien
quelle
4

In der WSL scheint es ein Problem mit der Pfadkonvertierung zu geben. Der Speicherort der Docker-Datei in Ubuntu (wo Docker ausgeführt wird und wo Dockerfile lebt) ist "/ home / sxw455 / App1", aber keiner dieser Befehle hat funktioniert:

$ pwd
/home/sxw455/App1
$ ll
total 4
drwxrwxrwx 0 sxw455 sxw455 4096 Dec 11 19:28 ./
drwxr-xr-x 0 sxw455 sxw455 4096 Dec 11 19:25 ../
-rwxrwxrwx 1 sxw455 sxw455  531 Dec 11 19:26 Dockerfile*
-rwxrwxrwx 1 sxw455 sxw455  666 Dec 11 19:28 app.py*
-rwxrwxrwx 1 sxw455 sxw455   12 Dec 11 19:27 requirements.txt*

$ docker build -t friendlyhello .
unable to prepare context: unable to evaluate symlinks in Dockerfile path: GetFileAttributesEx C:\Windows\System32\Dockerfile: The system cannot find the file specified.

$ docker build -t friendlyhello "/home/sxw455/App1"
unable to prepare context: path "/home/sxw455/App1" not found

In Windows lautet der eigentliche Pfad jedoch:

C:\Users\sxw455\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState\rootfs\home\sxw455\App1

Und so musste ich das tun (obwohl ich es von Bash ausgeführt habe):

$ docker build -t friendlyhello 
"C:\Users\sxw455\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState\rootfs\home\sxw455\App1"

Sending build context to Docker daemon   5.12kB
Step 1/7 : FROM python:2.7-slim
 ---> 0dc3d8d47241
Step 2/7 : WORKDIR /app
 ---> Using cache
 ---> f739aa02ce04
Step 3/7 : COPY . /app
 ---> Using cache
 ---> 88686c524ae9
Step 4/7 : RUN pip install --trusted-host pypi.python.org -r requirements.txt
 ---> Using cache
 ---> b95f02b14f78
Step 5/7 : EXPOSE 80
 ---> Using cache
 ---> 0924dbc3f695
Step 6/7 : ENV NAME World
 ---> Using cache
 ---> 85c145785b87
Step 7/7 : CMD ["python", "app.py"]
 ---> Using cache
 ---> c2e43b7f0d4a
Successfully built c2e43b7f0d4a
Successfully tagged friendlyhello:latest
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

Ich hatte während der Erstinstallation ähnliche Probleme mit Umgebungsvariablen und befolgte einige Ratschläge, die besagten, Windows DockerCE zu installieren und die Umgebungsvariablen zu hacken, anstatt Ubuntu DockerCE zu installieren, da (ich hoffe, ich habe mich richtig daran erinnert) WSL nicht vollständig implementiert ist systemctl. Sobald die Windows Docker CE-Installation abgeschlossen und die Umgebungsvariablen festgelegt sind, funktioniert Docker unter WSL / Ubuntu einwandfrei.

Kommissar
quelle
Das hat bei mir funktioniert! Ich habe nur Docker Toolbox installiert und nicht in WSL installiert. Stattdessen verwende ich die ausführbaren Windows-Dateien direkt, da WSL dies jetzt tun kann.
Lawrence Lee
4

Ich hatte mein DockerFile von VS2017 Docker Support Tool erstellt und hatte den gleichen Fehler. Nach einer Weile wurde mir klar, dass ich mich nicht im richtigen Verzeichnis befand, das die Docker-Datei enthält (~\source\repos\DockerWebApplication\). cd'ed auf die richtige Datei, (~/source/repos/DockerWebApplication/DockerWebApplication)die sich im Projekt befand und das Docker-Image erfolgreich erstellt hat.

Hasan
quelle
4

Der folgende Befehl hat bei mir funktioniert. Docker build -t docker-whale -f Dockerfile.txt.

AMAN BHARDWAJ
quelle
Dockerfile ist keine TXT-Datei. Wenn Sie es als TXT-Datei haben, wird es erneut einen Fehler geben.
Donald Shahini
3

Zwei Möglichkeiten, eine Docker-Datei zu erstellen:

Sie können entscheiden, den Dateinamen, aus dem erstellt werden soll, nicht anzugeben, sondern nur einen Pfad angeben (auf diese Weise muss der Dateiname Dockerfileohne angehängte Erweiterung sein, z. B.:docker build -t docker-whale:tag path/to/Dockerfile

oder

Sie können eine Datei mit angeben, -fund es spielt keine Rolle, welche Erweiterung (innerhalb des angemessenen Rahmens).txt , .dockerfile, .Dockerfileetc ..) Sie sich entscheiden, zum Beispiel docker build -t docker-whale:tag /path/to/file -f docker-whale.dockerfile.

PontiusTheBarbarian
quelle
2

Ich hatte meine Docker-Datei ursprünglich in PowerShell erstellt und obwohl ich keine Erweiterung in der Datei sah, wurde sie als PS-Dateityp angezeigt ... Nachdem ich die Datei aus Notepad ++ erstellt hatte, musste ich die Datei "Alle Typen ( . )" Auswählen Geben Sie den Dateinamen (Dockerfile) ohne Erweiterung ein. Dadurch konnte mein Image-Build-Befehl erfolgreich ausgeführt werden. Stellen Sie einfach sicher, dass Ihre Docker-Datei den Typ "Datei" hat.

Helper7123
quelle
2

Das Problem ist, dass der Dateiname Dockerfile und nicht DockerFile oder Dockerfile sein sollte, sondern D-Großbuchstaben, gefolgt von ockerfile in Kleinbuchstaben

Vincent
quelle
2

Stellen Sie sicher, dass Sie DOCKERfilesich im ROOT des Anwendungsverzeichnisses befinden. Ich hatte meins in src, was zu diesem Fehler führte, da Docker den Pfad zu nicht gefunden hatDOCKERfile

Frank Odoom
quelle
1

Um Dockerfile zu erstellen, speichern Sie automatisierten Inhalt in Dockerfile. nicht Dockerfile, da beim Öffnen eines Dateibefehls:

$ notepad Dockerfile 

(Eine Textdatei wird geschrieben, damit keine Datei erstellt werden kann.)

So erstellen Sie einen Dateilauf:

$ notepad Dockerfile

und jetzt laufen:

$ docker build -t docker-whale .

Stellen Sie sicher, dass Sie sich im aktuellen Verzeichnis von Dockerfile befinden.

niteshkumarmodi
quelle
1

Stellen Sie vor allem sicher, dass Ihr Dateiname lautet Dockerfile nicht funktioniert, wenn Sie einen anderen Namen verwenden (zumindest nicht für mich).

Auch wenn Sie sich in demselben Verzeichnis befinden, in dem sich die Docker-Datei befindet, verwenden Sie ein .dh docker build -t Myubuntu1:v1 . oder den absoluten Pfad, dh docker build -t Myubuntu1:v1 /Users/<username>/Desktop/Docker

ady6831983
quelle
1

I mein Fall (unter Windows 10 ausführen)
1) Benennen Sie die Datei myDockerFile.Dockerfilein Dockerfile( ohne Dateierweiterung) um.
Führen Sie dann diesen Befehl von außerhalb des Ordners aus:

docker build .\Docker-LocalNifi\ 

Dies funktioniert für mich und meine Arbeitskollegen, hoffe, dass das auch für Sie funktioniert

Yohan
quelle
1

Stellen Sie sicher, dass der Dateiname "Dockerfile" nicht mit einer Erweiterung gespeichert ist. Erstellen Sie einfach eine Datei ohne Erweiterung.

Stellen Sie sicher, dass sich Dockerfile in demselben Verzeichnis befindet, aus dem Sie das Docker-Image erstellen möchten.

Nakesh
quelle
0

Ich habe dies unter Windows erhalten, als sich der Pfad, in dem ich arbeitete, in einem Junction-Verzeichnis befand. Mein Fix war also, nicht unter diesem Pfad zu arbeiten.

Chris F. Carroll
quelle
0

Auf dem Mac funktioniert es für den folgenden Befehl. (Ich hoffe, Sie .Dockerfilebefinden sich in Ihrem Stammverzeichnis).

docker build -t docker-whale -f .Dockerfile .
Chanaka Caldera
quelle
0

Das Problem hängt mit dem Erstellungsverfahren für DockerFile zusammen.

Um zu arbeiten, öffnen Sie cmd, cd in das Verzeichnis von Interesse und geben Sie Folgendes ein:

abc>DockerFile

Dadurch wird eine Datei namens DockerFile in Ihrem Ordner erstellt.

Geben Sie nun Folgendes ein:

notepad DockerFile 

Dadurch wird die DockerFile-Datei im Editor geöffnet und Sie müssen den bereitgestellten Standardcode kopieren / einfügen.

Speichern Sie die Datei und erstellen Sie schließlich Ihr Bild mit Docker-Eingabe:

docker build -t docker-whale . 

Das funktioniert bei mir und ich hoffe es hilft anderen

Mitarbeiter
quelle
0

Falls wir mehrere Docker-Dateien in unserer Umgebung haben, reicht Dockerfile nicht aus.

docker build -t ihub -f Dockerfile.ihub .

Erzwingen Sie daher den Befehl (-f Argument), um Ihre Docker-Datei (Dockerfile.ihub) zu verwenden.

chethan bhounsley g
quelle
0

Ich habe fälschlicherweise erstellt Dockerfile.txt in meinem Arbeitsverzeichnis erstellt, was zu dem oben genannten Fehler führtebuild

Das Update bestand darin , die .txtErweiterung aus der Datei zu entfernen .

Der Dateiname sollte Dockerfilenur ohne Erweiterung sein .

iCantC
quelle
0

Führen Sie es docker build -t getting-started .in Ihrem Projektverzeichnis aus und stellen Sie sicher, dass Dockerfile vorhanden ist und keine .txtErweiterung hat. Wenn Sie unter Windows arbeiten, überprüfen Sie die 'Dateinamenerweiterung' auf der Registerkarte "Ansicht" im Datei-Explorer, um anzuzeigen, ob .txt vorhanden ist oder nicht, und entfernen Sie sie, wenn erstere wahr ist. Viel Glück.

Abdellah Ramadan
quelle
0

Ich hatte auch die gleichen Probleme und es wurde behoben, als ich eine Datei mit dem Namen DockerFile erstellte und alle Befehle erwähnte, die beim Erstellen eines Bildes ausgeführt werden wollten.

Yoshita Mahajan
quelle
-1

Ich habe es versucht und es hat funktioniert:

$ docker build -t test_dotnet_image 
"C:\Users\ssundarababu\Documents\Docker\Learn\SimpleDockerfile"

Bitte beachten Sie Anführungszeichen + Anführungszeichen um den Ordnernamen.

Hinweis: Im Ordner habe "C:\Users\ssundarababu\Documents\Docker\Learn\SimpleDockerfile"ich meine Docker-Datei.

Sudharsan S.
quelle
-1

So erstellen Sie ein Image über die Befehlszeile in Windows / Linux. 1. Erstellen Sie eine Docker-Datei in Ihrem aktuellen Verzeichnis. Beispiel: FROM ubuntu RUN apt-get update RUN apt-get -y installiere apache2 ADD. / var / www / html ENTRYPOINT apachectl -D FOREGROUND ENV-Name Devops_Docker 2. Speichern Sie ihn nicht mit der Erweiterung .txt. 3. Führen Sie unter Befehlszeile den Befehl Docker Build aus. -t apache2image

Udit Gandhi
quelle