Docker:无法准备上下文:无法评估Dockerfile路径中的符号链接:GetFileAttributesEx


187

我今天刚刚下载了适用于Windows 10 64bit的Docker Toolbox。我正在看教程。尝试使用Dockerfile构建映像时,我收到以下错误。

脚步:

  • 推出Docker Quickstart终端。
  • 创建它后的testdocker。
  • 按照“构建自己的映像” Web链接中所述准备Dockerfile
  • 在命令下面运行

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.

顺便说一句:我尝试了@ 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

4
更新:docker build -t XXX --file ./Dockefile。工作。Docker可能希望为Windows用户更新其文档。
villanux

4
如果 docker build -t XXX --file ./Dockefile可能是因为文件名错误,则会丢失
R。– eXa

17
这是一条非常糟糕的错误消息,仅表示“无法打开文件”-在Linux和macOS上相同。
RichVel

令人难以置信的错误消息。
有限赎罪

Answers:


204

在执行以下命令时:

docker build -t docker-whale .

检查当前工作目录中是否存在Dockerfile。


28
谢谢。我的问题是我在记事本中创建了Dockerfile,它已将.txt自动附加到文件名中。
IanGSY

5
您还可以显式地编写带有f标志的Dockerfile名称,如所示。docker build -f Dockerfile-dev.yaml -t my_container .如果项目中有多个Dockerfile(例如,每个环境一个),这可能会很有用。docker-compose也是如此。由于上下文(.)不匹配,因此将它们放在不同的子目录中将无效。
Sumi Straessle

1
@IanGSY我希望我能为此给你更多点。那也正是我的问题!
K. Brafford

5
记事本是一个非常邪恶的程序。
Per Lundberg

95

这是一个耻辱!

该错误信息是令人误解的。问题实际上与符号链接无关。通常只有docker无法找到描述构建的Dockerfile

典型原因如下:

  • Dockerfile 名称错误
    必须调用它Dockerfile。如果它被称为,例如dockerfile.DockerfileDockerfile.txt或其他,它不会被发现。
  • Dockerfile 不在上下文中
    如果您说的话docker build contextdir,Dockerfile必须位于contextdir/Dockerfile。如果您将它./Dockerfile放进去,则说找不到它。
  • Dockerfile 根本不存在
    听起来很傻?好吧,在编写了一个不错的Dockerfile之后,我从GitLab CI收到了以上错误消息,但是却忘记了检入。傻了吗?当然。不太可能吗?没有。

这不是唯一的耻辱...

不仅此错误消息是含糊和混乱的。我通常会发现某些docker概念和许多文档在语义上不精确。

真正的坏处之一是“标记”概念(截至2019年8月)。根据您在文档中查找的位置,它会说出以下所有内容(或多或少清晰):

  • tag命令,但是您提供的参数不称为标签或标签名称,而是称为图像名称。
  • 图像名称由图像名称和标记组成,并用冒号分隔。
  • tag命令参数中,标记名称是可选的,但图像名称是必需的。明显。
  • 用文档页面的话来说:
    docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • 但是,并非该映像名称中的所有映像名称实际上都是该映像名称,因为该映像名称可以以主机名作为前缀。
  • 尽管有时该主机名部分认为是映像名称的一部分。
  • 在任何情况下,主机名都x位于(或之前,但以某种方式总是坚持使用)其映像名的映像应放在该主机上x(在注册表中)。如果要访问此类图像,则或多或少必须使用带有主机前缀的该名称x
  • 但是具有该名称的映像可以驻留在任何主机上,而不仅是驻留在主机上x,因为将映像“推送”到x是单独的操作。
  • 因此,在Docker映像列表中看到该名称并没有多大意义,但肯定会暗示某些事情。有时是错误的。
  • 顺便说一句:我是否提到了名称空间?它们可以在主机名和映像名称中的映像名称之间切换。并且,根据您所处的位置,它们是否也是图像名称的一部分。

如果您对此感到困惑,那不是您的错。

结束语。


我认为如果没有第二部分的话,这将是一个更强大(更相关)的答案。
Paul Gear

1
很好的答案,并感谢您提供背景资料
莱昂(Leon)

使用相同的消息解决了我的问题的其他提示:请确保正确设置您的CaSinG。用于目录路径以及Dockerfile。由于linux对此非常挑剔。
RaimondB

38

如果您在Windows 8上工作,则将使用Docker工具箱。从mydockerbuild目录运行以下命令,因为您的Dockerfile是文本文件

docker build -t docker-whale -f ./Dockerfile.txt .

3
如果您需要这样做,以供将来参考,这是因为Dockerfile具有扩展名,而默认情况下Docker期望它也没有。使用扩展名手动设置文件会增加您不需要的麻烦。您应该将Windows资源管理器设置为显示扩展名,然后删除该扩展名。
亚历克斯

如果您正在阅读Docker文档“入门”教程,则可以使用以下代码:docker build -t friendlyhello -f ./Dockerfile.txt .
Mike Kellogg,

您还必须指定文件名和伪路径,这确实是很糟糕的语义。和/或始终将文件命名为Dockerfile。:-(
myloginid

这挽救了我的一天。顺便说一句,我正在使用Mac机器。但是这里的问题是Dockerfile是创建的纯文本文件。谢谢哥们的帮助。
Sachidananda Naik

23

文件名应为Dockerfile而不应为.Dockerfile该文件不应具有任何扩展名。


14

我已将文件dockerfile命名为dockerfile而不是Dockerfile(大写),更改后,它开始处理我的“ Dockerfile”。


14

只需从Dockerfile中删除扩展名.txt并运行命令

docker build -t image-name 

它肯定会工作。


9

我使用了正确的命令来创建映像,但在MacBook中却出现了此错误,

docker build -t testimg .

后来我发现路径是问题所在。只需导航到包含docker文件的正确路径即可。只需仔细检查您当前的工作目录即可。


4

在Windows 10中... period是第一个参数

docker build . -t docker-whale


8
不再(如果有)docker build -t docker-whale .是有效的命令
sebagomez

4

那是因为记事本在Dockerfile的末尾添加了“ .txt”


4

在WSL中,路径转换似乎存在问题。Dockerfile在Ubuntu中的位置(我正在运行Docker以及Dockerfile所在的位置)为“ / home / sxw455 / App1”,但以下命令均无效:

$ 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

但是在Windows中,实际路径是:

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

因此,我不得不这样做(即使我是从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.

在初始安装过程中,我对环境变量有类似的问题,并遵循一些建议,即安装Windows DockerCE和破解环境变量,而不是安装Ubuntu DockerCE,因为(我希望我没记错)WSL不能完全实现systemctl。完成Windows Docker CE安装并设置环境变量后,docker就可以在WSL / Ubuntu下正常工作。


这对我有用!我只安装了Docker Toolbox,而没有在WSL中安装它。相反,我直接使用Windows可执行文件,因为WSL现在可以这样做。
劳伦斯·李

4

我已经通过VS2017 Docker支持工具创建了DockerFile,并且遇到了相同的错误。过了一会儿,我意识到我不在包含Dockerfile的正确目录中(~\source\repos\DockerWebApplication\)。cd到(~/source/repos/DockerWebApplication/DockerWebApplication)项目内部的正确文件,并成功创建了docker镜像。



3

构建dockerfile的两种方法:

您可以决定不指定要从其生成文件的名称,而仅通过指定路径来生成文件(这样做的话,文件名必须不Dockerfile带扩展名,例如:docker build -t docker-whale:tag path/to/Dockerfile

要么

您可以指定一个文件-f,它并不重要扩展名(在合理范围内.txt.dockerfile.Dockerfile等..)你决定使用,例如docker build -t docker-whale:tag /path/to/file -f docker-whale.dockerfile


2

我最初是在PowerShell中创建我的Dockerfile的,尽管我没有看到该文件的扩展名,但它显示为PS File Type ...一旦我从Notepad ++创建该文件,请确保选择“所有类型()”文件在文件名(Dockerfile)上键入不带扩展名的文件。这使我的映像构建命令成功完成。...只需确保您的Dockerfile的类型为“文件” ...


2

问题是文件名应该是Dockerfile,而不是DockerFile或dockerfile,它应该是D大写字母,后跟ockerfile(小写形式)


2

确保您DOCKERfile位于应用程序目录的根目录中,我在src中拥有我的名字,导致此错误,因为Docker找不到路径DOCKERfile


1

要构建Dockerfile,请将自动化内容保存在Dockerfile中。不是Dockerfile,因为在打开文件命令时:

$ notepad Dockerfile 

(已写入文本文件,因此无法生成文件)

要生成文件,请运行:

$ notepad Dockerfile

现在运行:

$ docker build -t docker-whale .

确保您在Dockerfile的当前目录中。


1

最重要的是确保您的文件名是 Dockerfile(至少对我而言不行)。

另外,如果您在Dockerfile所在的目录中,则使用.ie docker build -t Myubuntu1:v1 . 或使用绝对路径,即 docker build -t Myubuntu1:v1 /Users/<username>/Desktop/Docker


1

我的情况(从Windows 10运行)
1)将文件重命名myDockerFile.DockerfileDockerfile不带文件扩展名)。
然后文件夹外部运行此命令:

docker build .\Docker-LocalNifi\ 

这对我和我在工作的同事都有效,希望对您也有用


1

确保文件名“ Dockerfile”未保存任何扩展名。只需创建一个没有任何扩展名的文件。

并确保Dockerfile与您尝试构建Docker映像的目录位于同一目录中。


0

当我使用的路径位于Junction目录下时,我在Windows上获得了此文件。因此,我的解决办法是在该路径下不起作用。



0

该问题与DockerFile创建过程有关。

为了工作,请打开cmd,cd到感兴趣的目录,然后键入:

abc>DockerFile

这将在文件夹内创建一个名为DockerFile的文件。

现在输入:

notepad DockerFile 

这将在记事本中打开DockerFile文件,您将不得不复制/粘贴提供的标准代码。

保存文件,现在,使用Docker输入最终构建映像:

docker build -t docker-whale . 

这对我有用,希望对其他人有帮助


0

如果我们的环境中有多个docker文件,则Dockerfile将无法满足我们的要求。

docker build -t ihub -f Dockerfile.ihub .

因此,force(-f arguments)命令使用您的docker文件(Dockerfile.ihub)


0

我错误地创造了 Dockerfile.txt在工作目录中了导致上述错误,而build

解决方法是从文件中删除.txt扩展名

文件名应该是Dockerfile唯一的,没有任何扩展


0

docker build -t getting-started .在您的项目目录中执行,并确保Dockerfile存在并且没有.txt扩展名。如果您使用的是Windows,请在“文件资源管理器”的“视图”选项卡下检查“文件扩展名”,以显示是否存在.txt,如果前者为true,则将其删除。祝好运。


0

我也遇到了同样的问题,当我创建了以DockerFile命名的文件并提到了要在创建任何映像时执行的所有命令时,该问题已得到解决。


-1

我尝试了一下,它起作用了:

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

请查看文件夹名称周围的引号+取消引号。

注意:在文件夹中,"C:\Users\ssundarababu\Documents\Docker\Learn\SimpleDockerfile"我有我的Dockerfile。


-1

从Windows / Linux中的命令行构建映像。1.在当前目录中创建一个docker文件。例如:FROM ubuntu RUN apt-get update RUN apt-get -y install apache2 ADD。/ var / www / html ENTRYPOINT apachectl -D FOREGROUND ENV名称Devops_Docker 2.不要以.txt扩展名保存它。3.在命令行下运行命令docker build。-t apache2image

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.