Docker: không thể chuẩn bị ngữ cảnh: không thể đánh giá các liên kết tượng trưng trong đường dẫn Dockerfile: GetFileAttributEx


189

Tôi vừa tải xuống Docker Toolbox cho Windows 10 64bit hôm nay. Tôi đang xem hướng dẫn. Tôi đang gặp phải lỗi sau khi cố gắng xây dựng hình ảnh bằng Dockerfile.

Các bước:

  • Ra mắt thiết bị đầu cuối Docker Quickstart.
  • testdocker sau khi tạo nó.
  • Chuẩn bị Dockerfile như tài liệu trong liên kết web "Xây dựng hình ảnh của riêng bạn"
  • chạy dưới lệnh

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: Tôi đã thử một số tùy chọn được đề cập @ 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
Cập nhật: docker build -t XXX --file ./Dockefile. đã làm việc. Docker có thể muốn cập nhật tài liệu của họ cho người dùng Windows.
Villanux 19/2/2016

4
Nếu docker build -t XXX --file ./Dockefilecó thể là do bạn đã đặt sai tên tệp thì nó thiếu R.
eXa

17
Đây là một thông báo lỗi đáng kinh ngạc, nó chỉ có nghĩa là "không thể mở tệp" - tương tự trên Linux và macOS.
RichVel

Tâm trí thông báo lỗi xấu.
Chuộc tội giới hạn

Câu trả lời:


205

trong khi thực hiện lệnh sau:

docker build -t docker-whale .

kiểm tra xem Dockerfile có trong thư mục làm việc hiện tại của bạn không.


28
Cảm ơn. Vấn đề của tôi là tôi đã tạo Dockerfile của mình trong Notepad và nó đã tự động thêm .txt vào tên tệp.
IanGSY

5
Bạn cũng có thể viết rõ ràng tên Dockerfile bằng fcờ, vì trong docker build -f Dockerfile-dev.yaml -t my_container .Điều này có thể chứng minh hữu ích nếu bạn có một số Dockerfile trong dự án của bạn, ví dụ như một môi trường. Điều tương tự áp dụng cho docker-compose. Đặt chúng trong các thư mục con khác nhau sẽ không hoạt động, vì bối cảnh ( .) sẽ không khớp.
Sumi Straessle

1
@IanGSY Tôi ước tôi có thể cho bạn nhiều điểm hơn cho điều đó. Đó chính xác là vấn đề của tôi quá!
K. Brafford

5
Notepad là một chương trình ác quá mức.
Per Lundberg

98

Thật là xấu hổ!

Thông báo lỗi là sai lệch. Vấn đề không có gì để làm với symlink thực sự. Thông thường chỉ có docker không thể tìm thấy Dockerfile mô tả bản dựng.

Những lý do điển hình là:

  • Dockerfile có tên sai .
    Nó phải được gọi Dockerfile. Nếu nó được gọi là, ví dụ, dockerfile, .Dockerfile, Dockerfile.txt, hoặc cách khác, nó sẽ không được tìm thấy.
  • Dockerfile không nằm trong ngữ cảnh .
    Nếu bạn nói docker build contextdir, Dockerfile phải ở contextdir/Dockerfile. Nếu bạn có nó trong, nói, ./Dockerfilethay vào đó, nó sẽ không được tìm thấy.
  • Dockerfile hoàn toàn không tồn tại .
    Nghe có vẻ ngớ ngẩn? Chà, tôi đã nhận được thông báo lỗi ở trên từ GitLab CI của mình sau khi tôi đã viết một Dockerfile đẹp, nhưng quên kiểm tra nó. Ngớ ngẩn? Chắc chắn rồi. Không có khả năng? Không.

Đó không phải là sự xấu hổ duy nhất ...

Không chỉ một thông báo lỗi này là mơ hồ và khó hiểu. Tôi thường tìm thấy một số khái niệm docker và phần lớn các tài liệu là không chính xác về mặt ngữ nghĩa.

Một trong những điểm thực sự tồi tệ là khái niệm "thẻ" (tính đến tháng 8 năm 2019). Tùy thuộc vào nơi bạn tìm trong tài liệu, nó đang nói tất cả những điều sau đây (rõ ràng hơn hoặc ít hơn):

  • taglệnh, nhưng đối số bạn cung cấp không được gọi là thẻ hoặc tên thẻ, nó được gọi là tên hình ảnh.
  • Tên hình ảnh bao gồm tên hình ảnh và thẻ, được phân tách bằng dấu hai chấm.
  • Trong tagđối số lệnh, tên thẻ là tùy chọn nhưng tên hình ảnh là bắt buộc. Rõ ràng.
  • Theo lời của trang tài liệu:
    docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • Nhưng không phải tất cả tên hình ảnh trong tên hình ảnh đó thực sự là tên hình ảnh, bởi vì tên hình ảnh có thể được tiền tố bởi một tên máy chủ.
  • Mặc dù đôi khi phần tên máy chủ đó được coi là một phần của tên hình ảnh.
  • Trong mọi trường hợp, một hình ảnh có tên máy chủ xtrong (hoặc trước đó, nhưng bằng cách nào đó kỳ diệu luôn bám vào) tên hình ảnh của nó sau đó được cho là sống trên máy chủ đó x(trong sổ đăng ký). Nếu bạn muốn truy cập một hình ảnh như vậy, ít nhiều bạn phải sử dụng tên này với tiền tố máy chủ x.
  • Nhưng một hình ảnh với tên đó có thể sống trên bất kỳ máy chủ nào, không chỉ trên x, bởi vì "đẩy" hình ảnh thành xmột hoạt động riêng biệt.
  • Vì vậy, nhìn thấy tên đó trong một danh sách hình ảnh docker không có nhiều ý nghĩa, nhưng nó chắc chắn sẽ ám chỉ một cái gì đó. Đôi khi sai.
  • Nhân tiện: Tôi đã đề cập đến không gian tên? Họ có thể đi giữa tên máy chủ và tên hình ảnh trong tên hình ảnh. Và cũng là một phần của tên hình ảnh hay không, tùy thuộc vào nơi bạn nhìn.

Nếu bạn bối rối bởi điều này, đó không phải là lỗi của bạn.

Hết lời ca ngợi.


Tôi nghĩ rằng đây sẽ là một câu trả lời mạnh mẽ hơn (và phù hợp hơn) mà không có hiệp 2.
Paul Gear

1
Câu trả lời tuyệt vời, và cảm ơn về thông tin cơ bản
leon

Mẹo bổ sung đã giải quyết vấn đề của tôi với cùng một thông điệp: hãy chắc chắn rằng CaSinG của bạn chính xác. Đối với đường dẫn thư mục cũng như Dockerfile. Vì linux khá kén chọn về điều đó.
RaimondB

38

Nếu bạn đang làm việc trên windows 8, bạn sẽ sử dụng hộp công cụ Docker. Từ thư mục mydockerbuild chạy lệnh bên dưới vì Dockerfile của bạn là một tệp văn bản

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

3
để tham khảo trong tương lai nếu bạn cần làm điều này bởi vì Dockerfile của bạn có phần mở rộng trong khi theo mặc định Docker mong đợi nó không quá. Đặt tệp theo cách thủ công với tiện ích mở rộng sẽ thêm đau đầu mà bạn không cần. Bạn nên đặt Windows explorer để hiển thị các tiện ích mở rộng và sau đó xóa tiện ích mở rộng.
Alex

nếu bạn đang theo dõi tài liệu hướng dẫn "bắt đầu" docker, bạn sẽ sử dụng điều này:docker build -t friendlyhello -f ./Dockerfile.txt .
Mike Kellogg

Ngữ nghĩa thực sự xấu của nó là bạn phải xác định tên tệp và đường dẫn giả. và / hoặc luôn đặt tên tệp của bạn là Dockerfile .. :-(
myloginid 26/03/18

Điều này đã cứu ngày của tôi. Nhân tiện, tôi đang sử dụng máy Mac. Nhưng điều hấp dẫn ở đây là Dockerfile đã được tạo ra một tệp văn bản thuần túy. Cảm ơn bạn đã giúp đỡ.
Sachidananda Naik

23

Tên của tập tin nên Dockerfilevà không .Dockerfile. Các tập tin không nên có bất kỳ phần mở rộng.


14

Tôi đã đặt tên cho tập tin của mình là dockerfile thay vì Dockerfile (viết hoa) và khi tôi thay đổi điều đó, nó bắt đầu xử lý "Dockerfile" của tôi.


14

Chỉ cần xóa phần mở rộng .txt khỏi Dockerfile và chạy lệnh

docker build -t image-name 

Nó sẽ làm việc chắc chắn.


9

Tôi đã gặp lỗi này (trong MacBook) mặc dù tôi đã sử dụng lệnh chính xác để tạo hình ảnh,

docker build -t testimg .

Sau này tôi thấy con đường đó là vấn đề. Chỉ cần điều hướng đến đường dẫn chính xác có chứa tệp docker. Chỉ cần kiểm tra lại thư mục làm việc hiện tại của bạn. Dễ dàng hoảng sợ!


4

Trong windows 10 ... period là tham số đầu tiên

docker build . -t docker-whale


8
không còn nữa (nếu có) docker build -t docker-whale .là một lệnh hợp lệ
sebagomez


4

Trong WSL, dường như có vấn đề với chuyển đổi đường dẫn. Vị trí của Dockerfile trong Ubuntu (nơi tôi đang chạy docker và nơi Dockerfile sống) là "/ home / sxw455 / App1", nhưng cả hai lệnh này đều không hoạt động:

$ 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

Nhưng trong Windows, đường dẫn thực tế là:

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

Và vì vậy tôi phải làm điều này (mặc dù tôi đã chạy nó từ 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.

Tôi gặp vấn đề tương tự với các biến môi trường trong quá trình cài đặt ban đầu và đã làm theo một số lời khuyên cho biết là cài đặt Windows DockerCE và hack các biến môi trường thay vì cài đặt Ubuntu DockerCE, vì (tôi hy vọng tôi nhớ chính xác điều này) mà WSL không thực hiện đầy đủ hệ thống Khi quá trình cài đặt Windows Docker CE được thực hiện và các biến môi trường được đặt, docker sẽ hoạt động tốt trong WSL / Ubuntu.


Điều này làm việc cho tôi! Tôi chỉ cài đặt Docker Toolbox và không cài đặt nó trong WSL; thay vào đó, tôi đang sử dụng các tệp thực thi Windows trực tiếp, vì WSL có thể làm điều đó ngay bây giờ.
Lawrence Lee

4

Tôi đã tạo công cụ DockerFile của mình bằng công cụ Hỗ trợ Docker của VS2017 và cũng gặp lỗi tương tự. Sau một thời gian, tôi nhận ra mình không ở đúng thư mục chứa Dockerfile (~\source\repos\DockerWebApplication\). cd'ed vào đúng tệp (~/source/repos/DockerWebApplication/DockerWebApplication)nằm trong dự án và tạo thành công hình ảnh docker.


4

Lệnh dưới đây làm việc cho tôi docker build -t docker-whale -f Dockerfile.txt.


Dockerfile không phải là tệp .txt. Nếu bạn có nó dưới dạng tệp .txt, nó sẽ báo lỗi một lần nữa.
Donald Shahini

3

Hai cách để xây dựng một dockerfile:

Bạn có thể quyết định không chỉ định tên tệp cần xây dựng và chỉ xây dựng nó chỉ định một đường dẫn (thực hiện theo cách này tên tệp phải Dockerfilekhông có phần mở rộng được nối thêm, ví dụ:docker build -t docker-whale:tag path/to/Dockerfile

hoặc là

Bạn có thể chỉ định một tập tin với -fvà nó không quan trọng mở rộng những gì (trong vòng lý do .txt, .dockerfile, .Dockerfilevv ..) bạn quyết định sử dụng, ví dụ docker build -t docker-whale:tag /path/to/file -f docker-whale.dockerfile.


2

Ban đầu tôi đã tạo Dockerfile của mình trong PowerShell và mặc dù tôi không thấy phần mở rộng trên tệp mà nó hiển thị dưới dạng Loại tệp PS ... một khi tôi đã tạo tệp từ Notepad ++, hãy chắc chắn chọn tệp "Tất cả các loại ( . )" Nhập không có phần mở rộng trên Tên tệp (Dockerfile). Điều đó cho phép lệnh xây dựng hình ảnh của tôi hoàn tất thành công .... Chỉ cần đảm bảo Dockerfile của bạn có Loại "Tệp" ...


2

Vấn đề là tên tệp phải là Dockerfile chứ không phải DockerFile hoặc dockerfile, nó phải là chữ D theo sau là ockerfile trong chữ thường


2

Hãy chắc chắn rằng bạn DOCKERfileđang ở trong ROOT của thư mục ứng dụng, tôi đã khai thác trong src dẫn đến lỗi này vì Docker không tìm thấy đường dẫn đếnDOCKERfile


1

Để xây dựng Dockerfile lưu nội dung tự động trong Dockerfile. không phải Dockerfile vì trong khi mở lệnh tập tin:

$ notepad Dockerfile 

(Một tệp văn bản được viết để tập tin không thể xây dựng)

Để xây dựng tập tin chạy:

$ notepad Dockerfile

và bây giờ chạy:

$ docker build -t docker-whale .

Hãy chắc chắn rằng bạn đang ở trong thư mục hiện tại của Dockerfile.


1

Quan trọng nhất là đảm bảo tên tệp của bạn là Dockerfilenếu bạn sử dụng tên khác, nó sẽ không hoạt động (ít nhất là nó không dành cho tôi.)

Ngoài ra nếu bạn ở trong cùng một thư mục nơi Dockerfile đang sử dụng .tức là docker build -t Myubuntu1:v1 . hoặc sử dụng đường dẫn tuyệt đối tức là docker build -t Myubuntu1:v1 /Users/<username>/Desktop/Docker


1

Tôi là trường hợp của tôi (chạy từ Windows 10)
1) Đổi tên tệp myDockerFile.Dockerfilethành Dockerfile( không có phần mở rộng tệp).
Sau đó chạy từ bên ngoài thư mục lệnh này:

docker build .\Docker-LocalNifi\ 

Điều này đang làm việc cho tôi và cho các đồng nghiệp của tôi tại nơi làm việc, hy vọng điều đó cũng sẽ làm việc cho bạn


1

Đảm bảo tên tệp "Dockerfile" không được lưu với bất kỳ tiện ích mở rộng nào. Chỉ cần tạo một tập tin mà không cần bất kỳ phần mở rộng.

Và hãy chắc chắn rằng Dockerfile nằm trong cùng thư mục mà bạn đang cố gắng xây dựng hình ảnh docker.


1

Trong trường hợp nếu chúng ta có nhiều tệp docker trong môi trường của mình thì Dockerfile sẽ không đáp ứng yêu cầu của chúng ta.

docker build -t ihub -f Dockerfile.ihub .

Vì vậy, sử dụng lệnh file(-f argument) để chỉ định tệp docker của bạn (Dockerfile.ihub)


Cũng cần phải có .(dấu chấm) ở cuối dòng, như các chương trình trên.
Purplejquet

Tài liệu cho docker buildlà ở đây: docs.docker.com/engine/reference/commandline/build
Purplejacket

0

Tôi đã nhận được điều này trên Windows khi đường dẫn tôi đang làm việc nằm trong thư mục Junction. Vì vậy, sửa chữa của tôi là không làm việc theo con đường đó.


0

Trên Mac, nó hoạt động cho lệnh dưới đây. (hy vọng bạn .Dockerfileđang ở trong thư mục gốc của bạn).

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

0

Vấn đề liên quan đến thủ tục tạo DockerFile.

Để làm việc, hãy mở cmd, cd vào thư mục quan tâm và gõ:

abc>DockerFile

Điều này sẽ tạo một tệp có tên DockerFile trong thư mục của bạn.

Bây giờ gõ:

notepad DockerFile 

Điều này sẽ mở tệp DockerFile trong notepad và bạn sẽ phải sao chép / dán mã tiêu chuẩn được cung cấp.

Lưu tệp và bây giờ, cuối cùng, xây dựng hình ảnh của bạn bằng cách gõ Docker:

docker build -t docker-whale . 

Điều này đang làm việc cho tôi và tôi hy vọng nó sẽ giúp người khác


0

Tôi đã tạo nhầm Dockerfile.txttrong thư mục làm việc của mình dẫn đến lỗi được đề cập ở trên trong khibuild

Cách khắc phục là xóa .txtphần mở rộng khỏi tệp.

Tên tập tin nên Dockerfilechỉ mà không cần bất kỳ phần mở rộng .


0

Thực thi docker build -t getting-started .trong thư mục dự án của bạn và đảm bảo Dockerfile có mặt và không có .txtphần mở rộng. Nếu bạn đang ở trên Windows, hãy kiểm tra 'phần mở rộng tên tệp' trong tab bên dưới trong File Explorer để hiển thị xem .txt có ở đó hay không và xóa nó nếu trước đây là đúng. Chúc may mắn.


0

Tôi cũng gặp phải vấn đề tương tự và nó đã được giải quyết khi tôi tạo tệp có tên DockerFile và đề cập đến tất cả các lệnh muốn được thực thi trong khi tạo bất kỳ hình ảnh nào.


0

Lỗi có nghĩa docker buildlà sử dụng một PATH | URLđầu vào không chính xác hoặc Dockerfilekhông thể tìm thấy trong thư mục hiện tại. Ngoài ra, hãy đảm bảo rằng khi chạy lệnh từ thiết bị đầu cuối tích hợp (ví dụ: bashbên trong IDE hoặc trình soạn thảo văn bản của bạn), bạn có quyền quản trị để làm như vậy. Tốt nhất nếu bạn có thể kiểm tra PATHtừ thiết bị đầu cuối của mình bằng pwd(trong bash shellhoặc dirnếu sử dụng đơn giản clitrên windows) và sao chép đường dẫn chính xác nơi bạn muốn hình ảnh được xây dựng.

docker build C:\windows\your_amazing_directory

docker build --help cũng sẽ hiển thị cho bạn các tùy chọn có sẵn để sử dụng trong trường hợp các lệnh không đúng hoặc không hợp lệ.


-1

Tôi đã thử điều này và nó đã làm việc:

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

Vui lòng xem dấu ngoặc kép + bỏ dấu ngoặc kép quanh tên người dùng.

Lưu ý: Trong Thư mục "C:\Users\ssundarababu\Documents\Docker\Learn\SimpleDockerfile"tôi có Dockerfile của mình.


-1

Để xây dựng một hình ảnh từ dòng lệnh trong windows / linux. 1. Tạo một tập tin docker trong thư mục hiện tại của bạn. ví dụ: TỪ ub Ubuntu RUN apt-get update RUN apt-get -y cài đặt apache2 ADD. / var / www / html ENTRYPOINT apachectl -D FOREGROUND ENV tên Devops_Docker 2. Đừng lưu nó với phần mở rộng .txt. 3. Dưới dòng lệnh chạy lệnh xây dựng docker. -t apache2image

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.