Docker: nie można przygotować kontekstu: nie można ocenić dowiązań symbolicznych w ścieżce Dockerfile: GetFileAttributesEx

189

Właśnie pobrałem dzisiaj Docker Toolbox dla Windows 10 64bit. Przechodzę samouczek. Otrzymuję następujący błąd podczas próby zbudowania obrazu za pomocą pliku Docker.

Kroki:

  • Uruchomiono terminal Docker Quickstart.
  • testdocker po utworzeniu.
  • Przygotuj plik Dockerfile zgodnie z dokumentacją w łączu internetowym „Buduj własny obraz”
  • pobiegł poniżej polecenia

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: Wypróbowałem kilka wymienionych opcji @ 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
źródło
4
Aktualizacja: doker build -t XXX --file ./Dockefile. pracował Docker może chcieć zaktualizować swoją dokumentację dla użytkowników systemu Windows.
villanux,
4
Jeśli docker build -t XXX --file ./Dockefilemoże to wynikać z błędnej nazwy pliku, brakuje R.
eXa
17
Jest to niezwykle zły komunikat o błędzie, oznacza to po prostu „nie można otworzyć pliku” - to samo w systemach Linux i macOS.
RichVel,
Niezwykle zły komunikat o błędzie.
Ograniczone Zadośćuczynienie

Odpowiedzi:

205

podczas wykonywania następującego polecenia:

docker build -t docker-whale .

sprawdź, czy plik Docker znajduje się w bieżącym katalogu roboczym.

kalyani chaudhari
źródło
28
Dzięki. Mój problem polegał na tym, że utworzyłem plik Dockerfile w Notatniku i automatycznie dołączyłem plik .txt do nazwy pliku.
IanGSY
5
Możesz również wyraźnie wpisać nazwę Dockerfile z fflagą, ponieważ w docker build -f Dockerfile-dev.yaml -t my_container .Może to okazać się przydatne, jeśli masz w swoim projekcie kilka Dockerfile, na przykład jeden na środowisko. To samo dotyczy komponowania dokerów. Umieszczanie ich w różnych podkatalogach nie będzie działać, ponieważ kontekst ( .) nie będzie pasował.
Sumi Straessle,
1
@IanGSY Chciałbym dać ci za to więcej punktów. To był dokładnie mój problem!
K. Brafford,
5
Notatnik to nadmiernie zły program.
Per Lundberg
98

Szkoda!

Komunikat o błędzie wprowadza w błąd. Problem nie ma tak naprawdę nic wspólnego z dowiązaniami symbolicznymi. Zwykle tylko doker nie może znaleźć pliku Docker opisującego kompilację.

Typowe przyczyny to:

  • Plik Docker ma niepoprawną nazwę .
    To musi być nazwane Dockerfile. Jeśli to się nazywa, na przykład dockerfile, .Dockerfile, Dockerfile.txt, lub inne, nie będzie można znaleźć.
  • Plik Docker nie znajduje się w kontekście .
    Jeśli powiesz docker build contextdir, plik Docker musi znajdować się w contextdir/Dockerfile. Jeśli go masz, powiedzmy ./Dockerfile, że go nie znajdziesz.
  • Plik dokowania w ogóle nie istnieje .
    Brzmi głupio? Cóż, otrzymałem powyższy komunikat o błędzie z mojego GitLab CI po napisaniu ładnego pliku Docker, ale zapomniałem go sprawdzić. Głupie? Pewnie. Mało prawdopodobne? Nie.

To nie jedyny wstyd ...

Nie tylko ten jeden komunikat o błędzie jest niejasny i mylący. Generalnie uważam, że niektóre koncepcje dokerów i duża część dokumentacji są semantycznie nieprecyzyjne.

Jednym z naprawdę złych punktów jest pojęcie „tag” (stan na sierpień 2019 r.). W zależności od tego, gdzie znajduje się dokumentacja, mówi o wszystkich następujących rzeczach (mniej lub bardziej wyraźnie):

  • Istnieje tagpolecenie, ale podany argument nie jest nazywany znacznikiem ani nazwą znacznika, ale nazywany jest nazwą obrazu.
  • Nazwa obrazu składa się z nazwy obrazu i znacznika oddzielonych dwukropkiem.
  • W tagargumencie polecenia nazwa znacznika jest opcjonalna, ale nazwa obrazu jest obowiązkowa. Oczywisty.
  • Słowami strony dokumentacji:
    docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • Ale nie cała nazwa obrazu w tej nazwie obrazu jest tak naprawdę nazwą obrazu, ponieważ nazwa obrazu może być poprzedzona nazwą hosta.
  • Chociaż czasami ta część nazwy hosta jest uważana za część nazwy obrazu.
  • W każdym razie obraz z nazwą hosta xw (lub wcześniej, ale jakoś magicznie zawsze przylega) do jego nazwy obrazu powinien wtedy żyć na tym hoście x(w rejestrze). Jeśli chcesz uzyskać dostęp do takiego obrazu, musisz mniej więcej użyć tej nazwy z prefiksem hosta x.
  • Ale obraz o tej nazwie może żyć na dowolnym hoście, nie tylko na x, ponieważ „wypychanie” obrazu xto osobna operacja.
  • Więc zobaczenie tej nazwy na liście obrazów dokerów nie znaczy wiele, ale na pewno coś insynuuje. Czasem źle.
  • Przy okazji: czy wspomniałem o przestrzeni nazw? Mogą przechodzić między nazwą hosta a nazwą obrazu w nazwie obrazu. I są również częścią nazwy obrazu, czy nie, w zależności od tego, gdzie patrzysz.

Jeśli jesteś tym zmieszany, to nie twoja wina.

Koniec rant.

Lutz Prechelt
źródło
Myślę, że byłoby to znacznie silniejsze (i bardziej odpowiednie) odpowiedź bez drugiej połowy.
Paul Gear
1
Świetna odpowiedź i dzięki za informacje
ogólne
Dodatkowa wskazówka, która rozwiązała mój problem z tym samym komunikatem: upewnij się, że Twój CaSinG jest poprawny. Ścieżka do katalogu oraz plik Docker. Ponieważ Linux jest dość wybredny.
RaimondB
38

Jeśli pracujesz na systemie Windows 8, będziesz używać przybornika Docker. Z katalogu mydockerbuild uruchom poniższe polecenie, ponieważ plik Docker jest plikiem tekstowym

docker build -t docker-whale -f ./Dockerfile.txt .
Divyanshu sachdeva
źródło
3
do wykorzystania w przyszłości, jeśli musisz to zrobić, ponieważ plik Docker ma rozszerzenie, podczas gdy domyślnie Docker też go nie oczekuje. Ręczne ustawienie pliku za pomocą rozszerzenia powoduje niepotrzebne bóle głowy. Powinieneś ustawić Eksploratora Windows, aby wyświetlał rozszerzenia, a następnie usuń rozszerzenie.
Alex
jeśli postępujesz zgodnie z samouczkiem „Pierwsze kroki” w dokumentacji dokera, skorzystaj z tego:docker build -t friendlyhello -f ./Dockerfile.txt .
Mike Kellogg
Jego naprawdę zła semantyka polega na tym, że musisz także podać nazwę pliku i ścieżkę fikcyjną. i / lub zawsze nazywaj swój plik Dockerfile .. :-(
myloginid
To uratowało mi dzień. Nawiasem mówiąc, używam komputera Mac. Ale haczyk polega na tym, że plik Docker został utworzony jako zwykły plik tekstowy. Dzięki kolego za pomoc.
Sachidananda Naik
23

Nazwa pliku powinna być Dockerfilei nie .Dockerfile. Plik nie powinien mieć żadnego rozszerzenia.

SharpCoder
źródło
14

Nazwałem plik dockerfile zamiast Dockerfile (wielkie litery), a kiedy to zmieniłem, zaczął przetwarzać mój „Dockerfile”.

Alan Fitzgerald
źródło
14

Wystarczy usunąć rozszerzenie .txt z Dockerfile i uruchomić polecenie

docker build -t image-name 

Na pewno zadziała.

satya
źródło
9

Mam ten błąd (w MacBooku), chociaż użyłem poprawnego polecenia, aby utworzyć obraz,

docker build -t testimg .

Później odkryłem, że ścieżka jest problemem. Wystarczy przejść do właściwej ścieżki zawierającej plik dokera. Wystarczy dwukrotnie sprawdzić bieżący katalog roboczy. Nie ma powodów do paniki!

arunprakashpj
źródło
4

W Windows 10 ... kropka jest pierwszym parametrem

docker build . -t docker-whale

PDA
źródło
8
nie jest już (jeśli w ogóle) docker build -t docker-whale .prawidłowym poleceniem
sebagomez
4

Po prostu dlatego, że Notatnik dodaje „.txt” na końcu Dockerfile

Aurélien
źródło
4

W WSL wydaje się występować problem z konwersją ścieżek. Lokalizacja Dockerfile w Ubuntu (gdzie uruchamiam dokera i gdzie Dockerfile mieszka) to „/ home / sxw455 / App1”, ale żadne z tych poleceń nie działało:

$ 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

Ale w systemie Windows rzeczywista ścieżka to:

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

Więc musiałem to zrobić (mimo że uruchomiłem to z 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.

Miałem podobne problemy ze zmiennymi środowiskowymi podczas pierwszej instalacji i postępowałem zgodnie z kilkoma wskazówkami, aby zainstalować Windows DockerCE i zhakować zmienne środowiskowe zamiast instalować Ubuntu DockerCE, ponieważ (mam nadzieję, że dobrze to zapamiętałem), że WSL nie w pełni implementuje systemctl. Po zakończeniu instalacji Windows Docker CE i ustawieniu zmiennych środowiskowych doker działa poprawnie pod WSL / Ubuntu.

Komisarz
źródło
To zadziałało dla mnie! Zainstalowałem tylko Docker Toolbox i nie zainstalowałem go w WSL; zamiast tego używam bezpośrednio plików wykonywalnych systemu Windows, ponieważ WSL może to zrobić teraz.
Lawrence Lee
4

Utworzyłem mój plik DockerFile według VS2017 Docker Support i miałem ten sam błąd. Po chwili zdałem sobie sprawę, że nie ma mnie w odpowiednim katalogu, który zawiera plik Docker (~\source\repos\DockerWebApplication\). cd'ed do właściwego pliku, (~/source/repos/DockerWebApplication/DockerWebApplication)który był w projekcie i pomyślnie utworzył obraz dokera.

Hasan
źródło
4

Poniższe polecenie działało dla mnie docker build -t docker-whale -f Dockerfile.txt.

AMAN BHARDWAJ
źródło
Plik Docker nie jest plikiem .txt. Jeśli masz go jako plik .txt, ponownie wyświetli błąd.
Donald Shahini,
3

Dwa sposoby na zbudowanie pliku docker:

Możesz zdecydować, aby nie podawać nazwy pliku, z którego chcesz budować, i po prostu skompiluj go, podając ścieżkę (w ten sposób nazwa pliku musi być Dockerfilebez dołączonego rozszerzenia, np .:docker build -t docker-whale:tag path/to/Dockerfile

lub

Można określić plik -fi nie ma znaczenia, jakie rozszerzenie (w granicach rozsądku .txt, .dockerfile, .Dockerfileetc ..) użytkownik zdecyduje się użyć, np docker build -t docker-whale:tag /path/to/file -f docker-whale.dockerfile.

PontiusTheBarbarian
źródło
2

Pierwotnie utworzyłem mój plik Docker w programie PowerShell i chociaż nie widziałem rozszerzenia pliku, który pokazywał jako typ pliku PS ... po utworzeniu pliku z Notepad ++ koniecznie wybrałem plik „Wszystkie typy ( . )” Wpisz bez rozszerzenia w nazwie pliku (Dockerfile). Dzięki temu moje polecenie kompilacji obrazu zakończyło się pomyślnie ... Upewnij się, że plik Docker ma typ „Plik” ...

Pomocnik7123
źródło
2

Problem polega na tym, że nazwa pliku powinna być Dockerfile, a nie DockerFile lub dockerfile powinna to być litera D, a po niej ockerfile małymi literami

Vincent
źródło
2

Upewnij się, że Twój DOCKERfileznajduje się w katalogu głównym aplikacji, miałem mój w src, co spowodowało ten błąd, ponieważ Docker nie znalazł ścieżki doDOCKERfile

Frank Odoom
źródło
1

Aby zbudować plik Dockerfile, zapisz zautomatyzowaną zawartość w Dockerfile. nie Dockerfile, ponieważ podczas otwierania polecenia pliku:

$ notepad Dockerfile 

(Plik tekstowy jest zapisywany, więc nie można go zbudować)

Aby skompilować uruchomienie pliku:

$ notepad Dockerfile

a teraz uruchom:

$ docker build -t docker-whale .

Upewnij się, że znajdujesz się w bieżącym katalogu Dockerfile.

niteshkumarmodi
źródło
1

Co najważniejsze, upewnij się, że nazwa twojego pliku brzmi, Dockerfilejeśli użyjesz innej nazwy, to nie zadziała (przynajmniej dla mnie nie.)

Także jeśli jesteś w tym samym katalogu, w którym znajduje się plik Docker, użyj .ie docker build -t Myubuntu1:v1 . lub użyj ścieżki bezwzględnej ie docker build -t Myubuntu1:v1 /Users/<username>/Desktop/Docker

ady6831983
źródło
1

Mój przypadek (uruchamiany z systemu Windows 10)
1) Zmień nazwę pliku myDockerFile.Dockerfilena Dockerfile( bez rozszerzenia pliku).
Następnie należy uruchomić z zewnątrz folderze tego polecenia:

docker build .\Docker-LocalNifi\ 

To działa dla mnie i dla moich kolegów w pracy, mam nadzieję, że to również zadziała dla ciebie

Yohan
źródło
1

Upewnij się, że nazwa pliku „Dockerfile” nie jest zapisana z żadnym rozszerzeniem. Wystarczy utworzyć plik bez żadnego rozszerzenia.

I upewnij się, że plik Dockerfile znajduje się w tym samym katalogu, w którym próbujesz zbudować obraz dokera.

Nakesh
źródło
1

W przypadku, gdy w naszym środowisku znajduje się wiele plików dokerów, po prostu plik Docker nie spełni naszych wymagań.

docker build -t ihub -f Dockerfile.ihub .

Więc użyj filekomendy (-f argument), aby określić plik dokera (Dockerfile.ihub)

chethan bhounsley g
źródło
Konieczne jest również umieszczenie .(kropki) na końcu linii, jak pokazano powyżej.
Purplejacket
Dokumentacja dla docker buildjest tutaj: docs.docker.com/engine/reference/commandline/build
Purplejacket
0

Dostałem to w systemie Windows, gdy ścieżka, w której pracowałem, znajdowała się w katalogu Junction. Więc moja poprawka polegała na tym, żeby nie działać pod tą ścieżką.

Chris F. Carroll
źródło
0

W systemie Mac działa dla polecenia poniżej. (mam nadzieję, że .Dockerfilejest w twoim katalogu głównym).

docker build -t docker-whale -f .Dockerfile .
Chanaka Caldera
źródło
0

Problem związany jest z procedurą tworzenia DockerFile.

Aby pracować, otwórz cmd, cd do katalogu z zainteresowaniami i wpisz:

abc>DockerFile

Spowoduje to utworzenie pliku o nazwie DockerFile w twoim folderze.

Teraz wpisz:

notepad DockerFile 

Spowoduje to otwarcie pliku DockerFile w notatniku i będziesz musiał skopiować / wkleić dostarczony standardowy kod.

Zapisz plik, a teraz nareszcie skompiluj obraz, wpisując Docker:

docker build -t docker-whale . 

To działa dla mnie i mam nadzieję, że pomaga innym

Pracownik
źródło
0

Błędnie utworzyłem Dockerfile.txtw moim katalogu roboczym, co prowadzi do wyżej wymienionego błędu podczasbuild

Poprawka polegała na usunięciu .txtrozszerzenia z pliku.

Nazwa pliku powinna być Dockerfiletylko bez rozszerzenia .

iCantC
źródło
0

Uruchom docker build -t getting-started .w katalogu projektu i upewnij się, że plik Docker jest obecny i nie ma .txtrozszerzenia. Jeśli korzystasz z systemu Windows, zaznacz „rozszerzenie nazwy pliku” na karcie widoku w Eksploratorze plików, aby pokazać, czy plik .txt istnieje, czy nie, i usuń go, jeśli to pierwsze jest prawdziwe. Powodzenia.

Abdellah Ramadan
źródło
0

Napotkałem również te same problemy i problem został rozwiązany, gdy utworzyłem plik o nazwie DockerFile i wspomniałem o wszystkich poleceniach, które chciałyby zostać wykonane podczas tworzenia dowolnego obrazu.

Yoshita Mahajan
źródło
0

Błąd oznacza, że docker buildalbo korzysta z PATH | URLniepoprawnie wprowadzonych danych, albo Dockerfilenie można ich znaleźć w bieżącym katalogu. Upewnij się również, że podczas uruchamiania polecenia ze zintegrowanego terminala (np. W bashtwoim IDE lub edytorze tekstowym) masz uprawnienia administratora, aby to zrobić. Najlepiej, jeśli możesz sprawdzić w PATHswoim terminalu za pomocą pwd(w bash shelllub dirjeśli używasz prostego w systemie cliWindows) i skopiuj dokładną ścieżkę, w której chcesz zbudować obraz.

docker build C:\windows\your_amazing_directory

docker build --help pokaże również dostępne opcje, które można wykorzystać w przypadku źle sformułowanych lub nielegalnych poleceń.

rags2riches
źródło
-1

Próbowałem tego i zadziałało:

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

Zobacz cudzysłowy + cofnij cudzysłowy wokół nazwy folderu.

Uwaga: W folderze "C:\Users\ssundarababu\Documents\Docker\Learn\SimpleDockerfile"mam mój plik Docker.

Sudharsan S.
źródło
-1

Aby zbudować obraz z wiersza poleceń w systemie Windows / Linux. 1. Utwórz plik dokera w bieżącym katalogu. np .: Z Ubuntu RUN apt-get update RUN apt-get -y zainstaluj apache2 ADD. / var / www / html ENTRYPOINT apachectl -D FOREGROUND ENV nazwa Devops_Docker 2. Nie zapisuj go z rozszerzeniem .txt. 3. W wierszu polecenia uruchom kompilację dokera poleceń. -t apache2image

Udit Gandhi
źródło