Docker: impossible de préparer le contexte: impossible d'évaluer les liens symboliques dans le chemin Dockerfile: GetFileAttributesEx

189

Je viens de télécharger Docker Toolbox pour Windows 10 64 bits aujourd'hui. Je suis en train de suivre le tutoriel. Je reçois l'erreur suivante en essayant de créer une image à l'aide d'un Dockerfile.

Pas:

  • Lancement du terminal Docker Quickstart.
  • testdocker après sa création.
  • Préparez Dockerfile comme indiqué dans le lien Web "Créer votre propre image"
  • a couru sous la commande

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.

BTW: j'ai essayé plusieurs options mentionnées @ https://github.com/docker/docker/issues/14339

    $ 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
la source
4
Mise à jour: docker build -t XXX --file ./Dockefile. travaillé. Docker voudra peut-être mettre à jour sa documentation pour les utilisateurs de Windows.
villanux
4
Si docker build -t XXX --file ./Dockefilec'est peut-être parce que vous avez un nom de fichier erroné, il manque le R.
eXa
17
C'est un message d'erreur incroyablement mauvais, cela signifie simplement "ne peut pas ouvrir le fichier" - même chose sur Linux et macOS.
RichVel
Message d'erreur époustouflant.
Expiation limitée le

Réponses:

205

lors de l'exécution de la commande suivante:

docker build -t docker-whale .

vérifiez que Dockerfile est présent dans votre répertoire de travail actuel.

kalyani chaudhari
la source
28
Merci. Mon problème était que j'avais créé mon Dockerfile dans le Bloc-notes et qu'il avait automatiquement ajouté .txt au nom de fichier.
IanGSY
5
Vous pouvez également écrire explicitement le nom du Dockerfile avec l' findicateur, comme dans docker build -f Dockerfile-dev.yaml -t my_container .Ceci peut s'avérer utile si vous avez plusieurs Dockerfile dans votre projet, un par environnement, par exemple. La même chose s'applique à docker-compose. Les placer dans différents sous-répertoires ne fonctionnera pas, car le contexte ( .) ne correspondra pas.
Sumi Straessle
1
@IanGSY J'aimerais pouvoir vous donner plus de points pour cela. C'était exactement mon problème aussi!
K.Brafford
5
Notepad est un programme excessivement diabolique.
Per Lundberg
98

C'est dommage!

Le message d'erreur est trompeur. Le problème n'a vraiment rien à voir avec les liens symboliques. C'est généralement seulement que docker ne peut pas trouver le Dockerfile décrivant la construction.

Les raisons typiques sont les suivantes:

  • Dockerfile a un nom incorrect .
    Il doit être appelé Dockerfile. Si elle est appelée, par exemple, dockerfile, .Dockerfile, Dockerfile.txtou autre, il ne sera pas trouvée.
  • Dockerfile n'est pas en contexte .
    Si vous dites docker build contextdir, le Dockerfile doit être à contextdir/Dockerfile. Si vous l'avez, disons, à la ./Dockerfileplace, il ne sera pas trouvé.
  • Dockerfile n'existe pas du tout .
    Cela semble idiot? Eh bien, j'ai reçu le message d'erreur ci-dessus de mon GitLab CI après avoir écrit un joli Dockerfile, mais j'ai oublié de l'enregistrer. Silly? Sûr. Improbable? Non.

Ce n'est pas la seule honte ...

Non seulement ce message d'erreur est vague et déroutant. Je trouve généralement que certains des concepts de docker et une grande partie de la documentation sont sémantiquement imprécis.

L'un des très mauvais points est la notion de «tag» (à partir d'août 2019). Selon l'endroit où vous regardez dans la documentation, il dit toutes les choses suivantes (plus ou moins clairement):

  • Il y a la tagcommande, mais l'argument que vous fournissez ne s'appelle pas une balise ou un nom de balise, il s'appelle un nom d'image.
  • Un nom d'image se compose d'un nom d'image et d'une balise, séparés par deux points.
  • Dans l' tagargument de commande, le nom de la balise est facultatif mais le nom de l'image est obligatoire. Évident.
  • Dans les mots de la page de documentation:
    docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • Mais tout le nom de l'image dans ce nom d'image n'est pas en fait le nom de l'image, car le nom de l'image peut être préfixé par un nom d'hôte.
  • Bien que parfois cette partie du nom d'hôte soit considérée comme faisant partie du nom de l'image.
  • Dans tous les cas, une image avec un nom d'hôte xdans (ou avant, mais qui s'accroche toujours comme par magie à) son nom d'image est alors censée vivre sur cet hôte x(dans un registre). Si vous souhaitez accéder à une telle image, vous devez plus ou moins utiliser ce nom avec le préfixe d'hôte x.
  • Mais une image portant ce nom peut vivre sur n'importe quel hôte, pas seulement sur x, car "pousser" l'image vers xest une opération distincte.
  • Donc, voir ce nom dans une liste d'images de docker ne signifie pas grand-chose, mais cela insinuera sûrement quelque chose. Parfois à tort.
  • Au fait: ai-je mentionné les espaces de noms? Ils peuvent aller entre le nom d'hôte et le nom de l'image dans le nom de l'image. Et font également partie du nom de l'image ou non, selon l'endroit où vous regardez.

Si cela vous dérange, ce n'est pas de votre faute.

Fin de la diatribe.

Lutz Prechelt
la source
Je pense que ce serait une réponse beaucoup plus forte (et plus pertinente) sans la 2ème mi-temps.
Paul Gear
1
Excellente réponse, et merci pour les informations de fond
leon
Astuce supplémentaire qui a résolu mon problème avec le même message: assurez-vous d'avoir votre CaSinG correct. Pour le chemin du répertoire ainsi que le Dockerfile. Puisque Linux est assez pointilleux à ce sujet.
RaimondB le
38

Si vous travaillez sur Windows 8, vous utiliserez la boîte à outils Docker. À partir du répertoire mydockerbuild, exécutez la commande ci-dessous car votre Dockerfile est un fichier texte

docker build -t docker-whale -f ./Dockerfile.txt .
Divyanshu sachdeva
la source
3
pour référence future si vous devez le faire, c'est parce que votre Dockerfile a une extension alors que par défaut Docker ne l'attend pas trop. La définition manuelle du fichier avec l'extension ajoute des maux de tête dont vous n'avez pas besoin. Vous devez configurer l'explorateur Windows pour afficher les extensions, puis supprimer l'extension.
Alex
si vous suivez le didacticiel de démarrage de la documentation de docker, vous utiliserez ceci:docker build -t friendlyhello -f ./Dockerfile.txt .
Mike Kellogg
C'est une très mauvaise sémantique que vous devez également spécifier le nom du fichier et le chemin factice. et / ou nommez toujours votre fichier comme Dockerfile .. :-(
myloginid
Cela m'a sauvé la journée. Au fait, j'utilise une machine Mac. Mais le hic ici est que le Dockerfile a été créé un fichier texte brut. Merci mon pote pour l'aide.
Sachidananda Naik le
23

Le nom du fichier doit être Dockerfileet non .Dockerfile. Le fichier ne doit avoir aucune extension.

SharpCoder
la source
14

J'avais nommé mon fichier dockerfile au lieu de Dockerfile (en majuscule), et une fois que j'ai changé cela, il a commencé à traiter mon "Dockerfile".

Alan Fitzgerald
la source
14

Supprimez simplement l'extension .txt de Dockerfile et exécutez la commande

docker build -t image-name 

Cela fonctionnera à coup sûr.

satya
la source
9

J'ai cette erreur (dans MacBook) bien que j'aie utilisé la commande correcte pour créer l'image,

docker build -t testimg .

Plus tard, j'ai découvert que ce chemin était le problème. Accédez simplement au chemin correct contenant le fichier docker. Vérifiez simplement votre répertoire de travail actuel. Rien de panique!

arunprakashpj
la source
4

Dans Windows 10 ... la période est le premier paramètre

docker build . -t docker-whale

PDA
la source
8
pas plus (si jamais) docker build -t docker-whale .est une commande valide
sebagomez
4

C'est juste parce que le Bloc-notes ajoute ".txt" à la fin de Dockerfile

Aurélien
la source
4

Dans WSL, il semble y avoir un problème avec la conversion de chemin. L'emplacement du Dockerfile dans Ubuntu (où j'exécute docker et où réside Dockerfile) est "/ home / sxw455 / App1", mais aucune de ces commandes n'a fonctionné:

$ 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

Mais sous Windows, le chemin réel est:

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

Et donc j'ai dû le faire (même si je l'ai couru depuis bash):

$ 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.

J'ai eu des problèmes similaires avec les variables d'environnement lors de l'installation initiale, et j'ai suivi quelques conseils qui disaient d'installer Windows DockerCE et de pirater les variables d'environnement plutôt que d'installer Ubuntu DockerCE, car (j'espère que je m'en suis souvenu correctement) que WSL ne met pas pleinement en œuvre systemctl. Une fois l'installation de Windows Docker CE terminée et les variables d'environnement définies, docker fonctionne correctement sous WSL / Ubuntu.

Comissar
la source
Cela a fonctionné pour moi! J'ai seulement installé Docker Toolbox et je ne l'ai pas installé dans WSL; à la place, j'utilise directement les exécutables Windows, puisque WSL peut le faire maintenant.
Lawrence Lee
4

J'avais créé mon DockerFile par l'outil de support Docker VS2017 et j'avais la même erreur. Au bout d'un moment, j'ai réalisé que je n'étais pas dans le bon répertoire contenant le Dockerfile (~\source\repos\DockerWebApplication\). cd dans le fichier correct (~/source/repos/DockerWebApplication/DockerWebApplication)qui se trouvait à l'intérieur du projet et a créé avec succès l'image docker.

Hasan
la source
4

La commande ci-dessous a fonctionné pour moi docker build -t docker-whale -f Dockerfile.txt.

AMAN BHARDWAJ
la source
Dockerfile n'est pas un fichier .txt. Si vous l'avez sous forme de fichier .txt, il donnera à nouveau une erreur.
Donald Shahini
3

Deux façons de créer un fichier docker:

Vous pouvez décider de ne pas spécifier le nom de fichier à partir duquel construire et simplement le construire en spécifiant un chemin (en procédant de cette façon, le nom du fichier doit être Dockerfilesans extension ajoutée, par exemple:docker build -t docker-whale:tag path/to/Dockerfile

ou

Vous pouvez spécifier un fichier -fet il n'a pas d' importance ce que l' extension (dans la raison .txt, .dockerfile, .Dockerfileetc ..) vous décidez d'utiliser, par exemple docker build -t docker-whale:tag /path/to/file -f docker-whale.dockerfile.

PontiusLeBarbare
la source
2

J'avais initialement créé mon Dockerfile dans PowerShell et bien que je n'ai pas vu d'extension sur le fichier, il montrait en tant que type de fichier PS ... une fois que j'ai créé le fichier à partir de Notepad ++ en étant sûr de sélectionner le fichier "Tous les types ( . )" Tapez sans extension sur le nom de fichier (Dockerfile). Cela a permis à ma commande de création d'image de se terminer avec succès ... Assurez-vous simplement que votre Dockerfile a un type de "Fichier" ...

Aide7123
la source
2

Le problème est que le nom du fichier doit être Dockerfile et non DockerFile ou dockerfile, il doit être D majuscule suivi de ockerfile en minuscules.

Vincent
la source
2

Assurez-vous que vous DOCKERfileêtes dans la racine du répertoire de l'application, j'avais le mien dans src, ce qui a entraîné cette erreur car Docker ne trouvait pas le chemin versDOCKERfile

Frank Odoom
la source
1

Pour créer Dockerfile, enregistrez le contenu automatisé dans Dockerfile. pas Dockerfile car lors de l'ouverture d'une commande de fichier:

$ notepad Dockerfile 

(Un fichier texte est écrit afin que le fichier ne puisse pas être construit)

Pour créer un fichier, exécutez:

$ notepad Dockerfile

et maintenant exécutez:

$ docker build -t docker-whale .

Assurez-vous que vous vous trouvez dans le répertoire actuel de Dockerfile.

niteshkumarmodi
la source
1

Plus important encore, assurez-vous que votre nom de fichier est que Dockerfilesi vous utilisez un autre nom, cela ne fonctionnera pas (du moins cela ne fonctionnait pas pour moi.)

Aussi, si vous êtes dans le même répertoire où le Dockerfile est, utilisez un .ie docker build -t Myubuntu1:v1 . ou utilisez le chemin absolu ie docker build -t Myubuntu1:v1 /Users/<username>/Desktop/Docker

ady6831983
la source
1

I my case (run from Windows 10)
1) Renommez le fichier myDockerFile.Dockerfileen Dockerfile( sans extension de fichier).
Ensuite, exécutez depuis l' extérieur du dossier cette commande:

docker build .\Docker-LocalNifi\ 

Cela fonctionne pour moi et pour mes collègues de travail, j'espère que cela fonctionnera également pour vous

Yohan
la source
1

Assurez-vous que le nom de fichier "Dockerfile" n'est enregistré avec aucune extension. Créez simplement un fichier sans aucune extension.

Et assurez-vous que Dockerfile se trouve dans le même répertoire à partir duquel vous essayez de créer une image Docker.

Nakesh
la source
1

Dans le cas où nous avons plusieurs fichiers docker dans notre environnement, seul Dockerfile ne suffira pas à nos besoins.

docker build -t ihub -f Dockerfile.ihub .

Utilisez donc la commande file(-f argument) pour spécifier votre fichier docker (Dockerfile.ihub)

chethan bhounsley g
la source
Il est également nécessaire d'avoir le .(point) à la fin de la ligne, comme le montre ci-dessus.
Purplejacket
La documentation pour docker buildest ici: docs.docker.com/engine/reference/commandline/build
Purplejacket
0

J'ai eu ceci sur Windows lorsque le chemin sur lequel je travaillais se trouvait dans un répertoire Junction. Donc, ma solution était de ne pas fonctionner sous cette voie.

Chris F Carroll
la source
0

Sur Mac, cela fonctionne pour la commande ci-dessous. (espérons que vous .Dockerfileêtes dans votre répertoire racine).

docker build -t docker-whale -f .Dockerfile .
Caldeira de Chanaka
la source
0

Le problème est lié à la procédure de création de DockerFile.

Pour travailler, ouvrez cmd, cd dans le répertoire qui vous intéresse et tapez:

abc>DockerFile

Cela créera un fichier appelé DockerFile dans votre dossier.

Tapez maintenant:

notepad DockerFile 

Cela ouvrira le fichier DockerFile dans le bloc-notes et vous devrez copier / coller le code standard fourni.

Enregistrez le fichier et maintenant, enfin, créez votre image avec la saisie Docker:

docker build -t docker-whale . 

Cela fonctionne pour moi et j'espère que cela aidera les autres

Employé
la source
0

J'ai créé par erreur Dockerfile.txtdans mon répertoire de travail conduisant à l'erreur mentionnée ci-dessus alors quebuild

Le correctif consistait à supprimer l' .txtextension du fichier.

Le nom du fichier doit être Dockerfileuniquement sans extension .

iCantC
la source
0

Exécutez docker build -t getting-started .dans votre répertoire de projet et assurez-vous que Dockerfile est présent et n'a pas d' .txtextension. Si vous êtes sous Windows, vérifiez «l'extension de nom de fichier» dans l'onglet sous l'onglet Affichage de l'Explorateur de fichiers pour voir si .txt est présent ou non et supprimez-le si le premier est vrai. Bonne chance.

Abdellah Ramadan
la source
0

J'ai également rencontré les mêmes problèmes et cela a été résolu lorsque j'ai créé un fichier nommé avec DockerFile et mentionné toutes les commandes qui voulaient être exécutées lors de la création d'une image.

Yoshita Mahajan
la source
0

L'erreur signifie qu'il docker buildutilise soit une PATH | URLentrée incorrecte, soit que le Dockerfilene peut pas être trouvé dans le répertoire actuel. Assurez-vous également que lorsque vous exécutez la commande depuis un terminal intégré (par exemple bashdans votre IDE ou votre éditeur de texte), vous disposez des autorisations d'administrateur pour le faire. Le mieux si vous pouvez vérifier le PATHdepuis votre terminal avec pwd(dans bash shellou dirsi vous utilisez un simple clisur Windows) et copier le chemin exact où vous voulez que l'image soit construite.

docker build C:\windows\your_amazing_directory

docker build --help vous montrera également les options disponibles à utiliser en cas de commandes mal formées ou illégales.

rags2riches
la source
-1

Je l'ai essayé et ça marche:

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

Veuillez voir les guillemets + les guillemets autour du nom du dossier.

Remarque: dans le dossier, "C:\Users\ssundarababu\Documents\Docker\Learn\SimpleDockerfile"j'ai mon Dockerfile.

Sudharsan S
la source
-1

Pour créer une image à partir de la ligne de commande dans windows / linux. 1. Créez un fichier docker dans votre répertoire actuel. par exemple: FROM ubuntu RUN apt-get update RUN apt-get -y install apache2 ADD. / var / www / html ENTRYPOINT apachectl -D FOREGROUND ENV nom Devops_Docker 2. Ne l'enregistrez pas avec l'extension .txt. 3. Sous la ligne de commande, exécutez la commande docker build. -t apache2image

Udit Gandhi
la source