Docker: невозможно подготовить контекст: невозможно оценить символические ссылки в пути Dockerfile: GetFileAttributesEx


189

Я только что скачал Docker Toolbox для Windows 10 64bit сегодня. Я прохожу учебник. Я получаю следующую ошибку при попытке создать образ с помощью Dockerfile.

шаги:

  • Запущен Docker Quickstart терминал.
  • Тестдокер после его создания.
  • Подготовьте 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
Обновление: сборка докера -t XXX --file ./Dockefile. работал. Docker может захотеть обновить свою документацию для пользователей Windows.
Villanux

4
Если docker build -t XXX --file ./Dockefileэто может быть из-за неправильного имени файла, то отсутствует R.
eXa

17
Это удивительно плохое сообщение об ошибке, оно просто означает «не удается открыть файл» - то же самое в Linux и macOS.
RichVel

Сногсшибательно плохое сообщение об ошибке.
Ограниченное искупление

Ответы:


205

при выполнении следующей команды:

docker build -t docker-whale .

убедитесь, что Dockerfile присутствует в вашем текущем рабочем каталоге.


28
Спасибо. Моя проблема была в том, что я создал свой Dockerfile в Блокноте, и он автоматически добавил .txt к имени файла.
IanGSY

5
Вы также можете явно написать имя Dockerfile с fфлагом, как в разделе docker build -f Dockerfile-dev.yaml -t my_container .Это может оказаться полезным, если у вас есть несколько Dockerfile в вашем проекте, например, для каждой среды. То же самое относится и к docker-compose. Помещение их в разные подкаталоги не будет работать, так как context ( .) не будет совпадать.
Суми Стрэссл

1
@IanGSY Я бы хотел дать вам больше очков за это. Это тоже была моя проблема!
К. Брэффорд

5
Блокнот - чрезмерно злая программа.
За Лундберг

98

Это позор!

Сообщение об ошибке вводит в заблуждение. Проблема не имеет ничего общего с символическими ссылками на самом деле. Обычно только докер не может найти файл Docker, описывающий сборку.

Типичные причины таковы:

  • Dockerfile имеет неправильное имя .
    Это должно быть названо Dockerfile. Если это называется, например, dockerfile, .Dockerfile, Dockerfile.txtили другой, он не будет найден.
  • Dockerfile не в контексте .
    Если вы говорите docker build contextdir, Dockerfile должен быть в contextdir/Dockerfile. Если у вас есть, скажем, ./Dockerfileвместо этого, он не будет найден.
  • Dockerfile не существует вообще .
    Звучит глупо? Ну, я получил вышеупомянутое сообщение об ошибке от моего GitLab CI после того, как я написал хороший Dockerfile, но забыл проверить его. Глупо? Конечно. Вряд ли? Нет .

Это не единственный позор ...

Не только это одно сообщение об ошибке является расплывчатым и запутанным. Обычно я нахожу некоторые концепции докеров и большую часть документации семантически неточными.

Одним из действительно плохих мест является понятие «тег» (по состоянию на август 2019 года). В зависимости от того, где вы смотрите в документации, он говорит все следующее (более или менее четко):

  • Существует tagкоманда, но аргумент вы поставляете не называется тегом или именем тега, он называется именем изображения.
  • Имя изображения состоит из имени изображения и тега, разделенных двоеточием.
  • В tagаргументе команды имя тега необязательно, но имя изображения обязательно. Очевидный.
  • По словам страницы документации:
    docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • Но не все имя изображения в этом имени изображения на самом деле является именем изображения, потому что имя изображения может иметь префикс имени хоста.
  • Хотя иногда это имя хоста часть будет рассматриваться как часть имени образа.
  • В любом случае, изображение с именем хоста xв (или ранее, но каким-то волшебным образом всегда цепляющемся за) имени этого образа, как предполагается, будет жить на этом хосте x(в реестре). Если вы хотите получить доступ к такому образу, вам нужно более или менее использовать это имя с префиксом хоста x.
  • Но изображение с таким именем может жить на любом хосте, а не только на нем x, потому что «выдвижение» изображения xявляется отдельной операцией.
  • Так что, увидев это имя в списке изображений докера, не очень много значит, но оно наверняка что-то намекает. Иногда неправильно.
  • Кстати: я упоминал пространства имен? Они могут идти между именем хоста и именем изображения в имени изображения. А также являются частью имени изображения или нет, в зависимости от того, где вы смотрите.

Если вас это смущает, это не ваша вина.

Конец разглагольствования.


Я думаю, что это был бы намного более сильный (и более уместный) ответ без второй половины.
Пол Гир

1
Отличный ответ, и спасибо за справочную информацию
Леон

Дополнительный совет, который решил мою проблему с тем же сообщением: убедитесь, что ваш CaSinG правильный. Для пути к каталогу, а также Dockerfile. Так как Linux очень требователен к этому.
RaimondB

38

Если вы работаете в Windows 8, вы бы использовали панель инструментов Docker. Из каталога mydockerbuild выполните команду ниже, так как ваш Dockerfile является текстовым файлом

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

3
для дальнейшего использования, если вам нужно это сделать, это потому, что ваш Dockerfile имеет расширение, тогда как по умолчанию Docker ожидает, что это не так. Установка файла вручную с расширением добавляет головные боли, которые вам не нужны. Вы должны установить проводник Windows, чтобы показать расширения, а затем удалить расширение.
Алекс

если вы следуете руководству по началу работы с документацией по докеру, вы можете использовать это:docker build -t friendlyhello -f ./Dockerfile.txt .
Майк Келлогг

Это действительно плохая семантика, что вы также должны указать имя файла и фиктивный путь. и / или всегда называйте свой файл как Dockerfile .. :-(
myloginid

Это спасло мой день. Кстати, я использую компьютер Mac. Но подвох в том, что Dockerfile был создан в виде простого текстового файла. Спасибо, приятель, за помощь.
Сачидананда Наик

23

Название файла должно быть Dockerfileи нет .Dockerfile. Файл не должен иметь никакого расширения.


14

Я назвал свой файл dockerfile вместо Dockerfile (с большой буквы), и как только я изменил это, он начал обрабатывать мой «Dockerfile».


14

Просто удалите расширение .txt из Dockerfile и выполните команду

docker build -t image-name 

Это будет работать наверняка.


9

Я получил эту ошибку (в MacBook), хотя я использовал правильную команду для создания изображения,

docker build -t testimg .

Позже я обнаружил, что путь - это проблема. Просто перейдите к правильному пути, который содержит файл Docker. Просто дважды проверьте ваш текущий рабочий каталог. Ничего страшного!


4

В Windows 10 ... точка является первым параметром

docker build . -t docker-whale


8
больше нет (если вообще когда-либо) docker build -t docker-whale .действительной команды
sebagomez


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

Я создал свой DockerFile с помощью инструмента поддержки Docker VS2017 и получил ту же ошибку. Через некоторое время я понял, что я не в правильном каталоге, который содержит Dockerfile (~\source\repos\DockerWebApplication\). cd'ed к правильному файлу, (~/source/repos/DockerWebApplication/DockerWebApplication)который был в проекте и успешно создал образ докера.


4

Ниже команда работала для меня docker build -t docker-whale -f Dockerfile.txt.


Dockerfile не является .txt файлом. Если у вас есть файл в формате .txt, он снова выдаст ошибку.
Дональд Шахини

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

Первоначально я создал свой Dockerfile в PowerShell и, хотя я не увидел расширения в файле, который отображался как тип файла PS ... как только я создал файл из Notepad ++, обязательно выбрав файл «Все типы ( . )» Введите без расширения имя файла (Dockerfile). Это позволило моей команде сборки образа успешно завершиться .... Просто убедитесь, что ваш Dockerfile имеет тип "Файл" ...


2

Проблема заключается в том, что имя файла должно быть Dockerfile, а не DockerFile или dockerfile, это должен быть D capital, за которым следует 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.Dockerfileв Dockerfile( без расширения файла).
Затем запустите из- под папки эту команду:

docker build .\Docker-LocalNifi\ 

Это работает для меня и для моих коллег на работе, надеюсь, что это также будет работать для вас


1

Убедитесь, что имя файла «Dockerfile» не сохранено с каким-либо расширением. Просто создайте файл без какого-либо расширения.

И убедитесь, что Dockerfile находится в том же каталоге, откуда вы пытаетесь создать образ Docker.


1

В случае, если в нашей среде есть несколько файлов Docker, просто Dockerfile не будет соответствовать нашим требованиям.

docker build -t ihub -f Dockerfile.ihub .

Поэтому используйте команду file(-f аргумент), чтобы указать свой файл докера (Dockerfile.ihub)


Также необходимо иметь .(точку) в конце строки, как показано выше.
Purplejacket

Документация для docker buildздесь: docs.docker.com/engine/reference/commandline/build
Purplejacket

0

Я получил это в Windows, когда путь, по которому я работал, находился в каталоге Junction. Так что я решил не работать по этому пути.


0

На Mac это работает для команды ниже. (надеюсь, что вы .Dockerfileв вашем корневом каталоге).

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

0

Проблема связана с процедурой создания DockerFile.

Для работы откройте cmd, cd в интересующем каталоге и введите:

abc>DockerFile

Это создаст файл с именем DockerFile внутри вашей папки.

Теперь введите:

notepad DockerFile 

Это откроет файл DockerFile в блокноте, и вам придется скопировать / вставить стандартный код, предоставленный.

Сохраните файл и, наконец, создайте свой образ с помощью Docker:

docker build -t docker-whale . 

Это работает для меня, и я надеюсь, что это помогает другим


0

Я ошибочно создал Dockerfile.txtв моем рабочем каталоге, что привело к вышеупомянутой ошибке, в то время какbuild

Исправление должно было удалить .txtрасширение из файла.

Имя файла должно быть Dockerfileтолько без расширения .


0

Выполните docker build -t getting-started .в каталоге вашего проекта и убедитесь, что Dockerfile присутствует и не имеет .txtрасширения. Если вы работаете в Windows, проверьте «расширение имени файла» на вкладке «Вид» в проводнике, чтобы показать, существует ли файл .txt или нет, и удалите его, если первое - «истина». Удачи.


0

Я также столкнулся с теми же проблемами, и это было решено, когда я создал файл с именем DockerFile и упомянул все команды, которые хотели быть выполнены при создании любого изображения.


0

Ошибка означает, что docker buildлибо используется PATH | URLнеправильный ввод, либо его Dockerfileнельзя найти в текущем каталоге. Кроме того, убедитесь, что при запуске команды из встроенного терминала (например, bashв вашей IDE или текстовом редакторе) у вас есть права администратора для этого. Лучше всего, если вы можете проверить PATHс вашего терминала с помощью pwdbash shellили dirпри использовании простого cliна Windows) и скопировать точный путь, где вы хотите, чтобы изображение было построено.

docker build C:\windows\your_amazing_directory

docker build --help также покажет вам доступные варианты для использования в случае неправильно сформированных или недопустимых команд.


-1

Я попробовал это, и это сработало:

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

Пожалуйста, смотрите кавычки + не кавычки вокруг Folderame.

Примечание: в папке у "C:\Users\ssundarababu\Documents\Docker\Learn\SimpleDockerfile"меня есть Dockerfile.


-1

Чтобы создать образ из командной строки в Windows / Linux. 1. Создайте файл Docker в вашем текущем каталоге. Например: ОТ Ubuntu RUN apt-get update RUN apt-get -y установить apache2 ADD. / var / www / html ENTRYPOINT apachectl -D ПРЕДВАРИТЕЛЬНОЕ имя ENV Devops_Docker 2. Не сохраняйте его с расширением .txt. 3. В командной строке выполните команду Docker build. -t apache2image

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.