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

时间:2016-02-19 17:48:23

标签: docker dockerfile

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

步骤:

  • 推出Docker Quickstart终端。
  • 创建它后的testdocker。
  • 准备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.

BTW:我尝试了几个提及@ 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

34 个答案:

答案 0 :(得分:123)

执行以下命令时

"docker build -t docker-whale ."

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

答案 1 :(得分:26)

如果您正在使用Windows 8,那么您将使用Docker工具箱。 从mydockerbuild目录运行以下命令,因为Dockerfile是一个文本文件

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

答案 2 :(得分:23)

太可惜了!

该错误消息具有误导性。问题实际上与符号链接无关。通常, docker无法找到描述构建的Dockerfile

典型原因如下:

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

这不是唯一的耻辱...

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

notion of "tag"(截至2019年8月)是一个真正的坏处。根据您在文档中查找的位置,它会说出以下所有内容(或多或少清晰):

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

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

咆哮结束。

答案 3 :(得分:11)

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

docker build -t image-name 

它肯定会起作用。

答案 4 :(得分:10)

  1. 确保您已移动到 Dockerfile 所在的目录。
  2. 确保您的 Dockerfile 没有扩展名。也就是说,不是 Dockerfile.txt、Dockerfile.rtf 或任何其他文件。
  3. 确保您命名为 Dockerfile,而不是 DockerFile、dockerfile 或任何其他名称。

答案 5 :(得分:9)

我已经命名了我的文件dockerfile而不是Dockerfile(大写),一旦我更改了它,它就开始处理我的“Dockerfile”。

答案 6 :(得分:8)

文件名应为import numpy as np from time import sleep from time import time from smbus2 import SMBus # Helper timing functions _tstart_stack = [] def tic(): _tstart_stack.append(time()) def toc(fmt="Elapsed: %s s"): print(fmt % (time() - _tstart_stack.pop())) # Datasheet: https://www.pololu.com/file/0J1087/LSM6DS33.pdf # REGISTER DEFINITIONS: WHO_AM_I = 0x0F # page 46 WHO_AM_I_VAL = 0b01101001 # FIFO registers FIFO_STATUS1 = 0x3A # page 59 FIFO_STATUS2 = 0x3B # page 60 FIFO_STATUS3 = 0x3C # page 60 FIFO_STATUS4 = 0x3D # page 61 FIFO_CTRL1 = 0x06 # page 40 FIFO_CTRL2 = 0x07 # page 40 FIFO_CTRL3 = 0x08 # page 41 FIFO_CTRL4 = 0x09 # page 42 FIFO_CTRL5 = 0x0A # page 43 FIFO_DATA_OUT_L = 0x3E # page 61 FIFO_DATA_OUT_H = 0x3F # page 61 # Control registers CTRL1_XL = 0x10 # page 46 CTRL2_G = 0x11 # page 48 CTRL3_C = 0x12 # page 49 CTRL4_C = 0x13 # page 50 CTRL5_C = 0x14 # page 50 CTRL6_C = 0x15 # page 51 CTRL7_G = 0x16 # page 52 CTRL8_XL = 0x17 # page 52 CTRL9_XL = 0x18 # page 53 CTRL10_C = 0x19 # page 54 TAP_CFG = 0x58 # page 64 WAKE_UP_DUR = 0x5C # page 66 # Accelerometer read OUTX_L_XL = 0x28 # page 58 OUTX_H_XL = 0x29 # page 58 OUTY_L_XL = 0x2A # page 58 OUTY_H_XL = 0x2B # page 59 OUTY_L_XL = 0x2C # page 59 OUTY_H_XL = 0x2D # page 59 # Gyro read OUTX_L_G = 0x22 # page 56 OUTX_H_G = 0x23 # page 57 OUTY_L_G = 0x24 # page 57 OUTY_H_G = 0x25 # page 57 OUTY_L_G = 0x26 # page 58 OUTY_H_G = 0x27 # page 58 # BIT DEFINITION MASKS FIFO_THRESHOLD = 0b10000000 # FTH in FIFO_STATUS2, 1 when threshold is crossed. FIFO_OVER_RUN = 0b01000000 # FIFO FULL + 1 sample FIFO_FULL = 0b00100000 # in FIFO_STATUS2, FIFO full on next sample FIFO_EMPTY = 0b00010000 # in FIFO_STATUS2 def init(BUS, LSM): # LSM6DS33 datasheet, page 46-54 # 104 Hz (high performance), 2g accelerometer full-scale selection, 50Hz anti-aliasing filter bandwidth selection BUS.write_byte_data(LSM, CTRL1_XL, 0b01000011) # 104 Hz (high performance), 245 dps (degrees per second), full scale disabled BUS.write_byte_data(LSM, CTRL2_G, 0b01000000) # BDU enabled, auto increment address on multiple byte access. BUS.write_byte_data(LSM, CTRL3_C, 0b01000100) # high pass filter gyroscope enabled BUS.write_byte_data(LSM, CTRL7_G, 0b01000000) # low pass filter accelerometer enabled and xyz gyro enable BUS.write_byte_data(LSM, CTRL10_C, 0b00111100) # threshold on 2016 samples BUS.write_byte_data(LSM, FIFO_CTRL1, 0b11100000) # Time stamp enable, FIFO on data ready, threshold on 2016 samples BUS.write_byte_data(LSM, FIFO_CTRL2, 0b10000111) # No decimation (downsampling) for gyro and acc BUS.write_byte_data(LSM, FIFO_CTRL3, 0b00001001) # No decimation (downsampling) for timer BUS.write_byte_data(LSM, FIFO_CTRL4, 0b00001000) # FIFO ODR 104Hz, FIFO continous mode BUS.write_byte_data(LSM, FIFO_CTRL5, 0b00100110) BUS.write_byte_data(LSM, TAP_CFG, 0b10000000) # Timer enable BUS.write_byte_data(LSM, WAKE_UP_DUR, 0b00000000) # Timer resolution 6.4ms def who_am_i(BUS, LSM): # whoami identification return BUS.read_byte_data(LSM, WHO_AM_I) == WHO_AM_I_VAL def wait_data_ready(BUS, LSM): # Check Accelerometer Data Ready while True: # while data not ready status = BUS.read_byte_data(LSM, 0x1E) if status & 0x01 == 1: return 1 def reset_timer(BUS, LSM): BUS.write_byte_data(LSM, 0x42, 0xAA) # TIMESTAMP2_REG Write 0xAA to reset. def reset_fifo(BUS, LSM): current_settings = BUS.read_byte_data(LSM, FIFO_CTRL5) bypassmode = 0b01111000 & current_settings BUS.write_byte_data(LSM, FIFO_CTRL5, bypassmode) # FIFO bypass mode sleep(0.1) BUS.write_byte_data(LSM, FIFO_CTRL5, current_settings) # Back to normal def read_fifo(BUS, LSM): while 1: data = [] # Read the two FIFO STATUS registers, addr is device I2C address status_regs = BUS.read_i2c_block_data(LSM, FIFO_STATUS1, 2) # Get the current number of samples in FIFO queue if FIFO_FULL & status_regs[1]: n_samp = 4095 else: n_samp = (status_regs[1] & 0b00001111)*256 + status_regs[0] if FIFO_EMPTY & status_regs[1]: print("FIFO EMPTY!") # THIS PRINT STATEMENT SPEEDS UP THE FOR LOOP BELOW # print("number of samples ", n_samp) if FIFO_THRESHOLD & status_regs[1]: tic() # Threshold: 2016 samples=4032bytes=126 reads of 32 bytes for _ in range(126): data.extend(BUS.read_i2c_block_data(LSM, FIFO_DATA_OUT_L, 32)) toc() status_regs = BUS.read_i2c_block_data(LSM, FIFO_STATUS1, 2) n_samp = (status_regs[1] & 0b00001111)*256 + status_regs[0] print("number of samples after read", n_samp) if __name__ == "__main__": # I2C bus and register BUS = SMBus(1) LSM = 0x6b # 3-axis gyroscope and 3-axis accelerometer print("Whoami: ", who_am_i(BUS, LSM)) init(BUS, LSM) reset_fifo(BUS, LSM) reset_timer(BUS, LSM) read_fifo(BUS, LSM) ,而不是Dockerfile该文件不应具有任何扩展名。

答案 7 :(得分:8)

虽然我使用了正确的命令来创建图像,但我有这个错误(在MacBook中),

docker build -t testimg .

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

答案 8 :(得分:4)

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

答案 9 :(得分:3)

那只是因为记事本添加" .txt"在Dockerfile的末尾

答案 10 :(得分:3)

在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下正常工作。

答案 11 :(得分:2)

在Windows 10中...句点是第一个参数

docker build . -t docker-whale

答案 12 :(得分:2)

我最初在PowerShell中创建了我的Dockerfile,虽然我没有看到它显示为PS文件类型的文件的扩展名...一旦我从Notepad ++创建文件,一定要选择&#34 ;所有类型()"文件名(Dockerfile)上没有扩展名的文件类型。这使我的图像构建命令成功完成....只需确保你的Dockerfile有一个"文件" ...

的类型

答案 13 :(得分:2)

以下命令对我有用 docker build -t docker-whale -f Dockerfile.txt。

答案 14 :(得分:2)

问题是文件名应该是Dockerfile而不是DockerFile或dockerfile它应该是D大写,然后是小写的ockerfile请注意

答案 15 :(得分:1)

最重要的是,如果您使用其他名称,请确保您的文件名是Dockerfile(至少对我而言不起作用)。

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

答案 16 :(得分:1)

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

$ notepad Dockerfile 

(写入文本文件,因此无法构建文件)

构建文件运行:

$ notepad Dockerfile

现在运行:

$ docker build -t docker-whale .

确保您位于Dockerfile的当前目录中。

答案 17 :(得分:1)

我是我的情况(从Windows 10运行)
1)将文件myDockerFile.Dockerfile重命名为Dockerfile文件扩展名)。
然后在该命令外的文件夹中来自

docker build .\Docker-LocalNifi\ 

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

答案 18 :(得分:1)

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

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

答案 19 :(得分:1)

该错误表示docker build正在使用错误输入的PATH | URL或在当前目录中找不到Dockerfile。另外,请确保从集成终端(例如,IDE或文本编辑器内的bash)运行命令时,您具有执行此操作的管理员权限。 最好是,您可以使用PATH从终端检查pwd(如果在Windows上使用简单的bash shell,则可以在dircli中进行检查并复制确切路径您要在其中构建图像的位置。

docker build C:\windows\your_amazing_directory

docker build --help还将向您显示在格式错误或非法命令时可用的选项。

答案 20 :(得分:0)

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

答案 21 :(得分:0)

在 Linux 中,文件夹区分大小写。我收到此错误是因为文件夹名称为 TestAPI 并且正在放置 TestApi。

答案 22 :(得分:0)

确保您运行命令

docker build . -t docker-whale 

来自具有dockerfile的目录

答案 23 :(得分:0)

请检查docker是否在您的Windows上运行,我尝试找到解决方案,然后不小心检查并找到问题

答案 24 :(得分:0)

如果您已将第二个驱动器作为“已安装的卷”安装到NTFS文件夹中,则会出现此问题。

将文件移动到已安装卷之外的驱动器位置。

答案 25 :(得分:0)

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

答案 26 :(得分:0)

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

答案 27 :(得分:0)

我在工作目录中错误创建了 Dockerfile.txt ,导致在build

时出现上述错误

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

文件名只能为 Dockerfile ,没有任何扩展名。

答案 28 :(得分:0)

问题与DockerFile创建过程有关。

为了工作,请打开cmd,cd到感兴趣的目录并输入:

abc>DockerFile

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

现在输入:

notepad DockerFile 

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

保存文件,现在,最后,使用Docker输入以下内容构建映像:

docker build -t docker-whale . 

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

答案 29 :(得分:0)

构建dockerfile的两种方法:

您可以决定不指定要从其生成文件的名称,而仅通过指定路径来生成文件(以这种方式执行,文件名必须为Dockerfile,且未附加扩展名,例如:{{1} }

您可以使用docker build -t docker-whale:tag path/to/file/指定文件,而决定使用什么扩展名(由于-f.txt.dockerfile等)。 ,例如.Dockerfile

答案 30 :(得分:0)

当我在工作的路径位于Junction目录下时,我在Windows上得到了这个。所以我的修复是不能在那条路上工作。

答案 31 :(得分:0)

在Mac上它适用于以下命令。 (希望你的.Dockerfile在你的根目录中。)

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

答案 32 :(得分:-1)

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

答案 33 :(得分:-1)

我试过这个并且有效:

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

请参阅foldername周围的引号+取消引号。

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