Docker: não é possível preparar o contexto: não é possível avaliar links simbólicos no caminho do Dockerfile: GetFileAttributesEx

189

Acabei de baixar o Docker Toolbox para Windows 10 de 64 bits hoje. Eu estou passando pelo tutorial. Estou recebendo o seguinte erro ao tentar criar uma imagem usando um Dockerfile.

Passos:

  • Lançado o terminal Docker Quickstart.
  • testdocker depois de criá-lo.
  • Prepare o Dockerfile conforme documentado no link da web "Crie sua própria imagem"
  • correu abaixo do comando

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: Tentei várias opções mencionadas @ 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
fonte
4
Atualização: docker build -t XXX --file ./Dockefile. trabalhou. O Docker pode querer atualizar sua documentação para usuários do Windows.
villanux 19/02/16
4
Se docker build -t XXX --file ./Dockefileisso pode ser porque você tem o errado nome de arquivo que está faltando a R.
EXA
17
Esta é uma mensagem de erro incrivelmente ruim, apenas significa "não é possível abrir o arquivo" - o mesmo no Linux e no macOS.
RichVel
Mensagem de erro incrivelmente ruim.
Expiação limitada

Respostas:

205

enquanto executa o seguinte comando:

docker build -t docker-whale .

verifique se o Dockerfile está presente no seu diretório de trabalho atual.

Kalyani Chaudhari
fonte
28
Obrigado. Meu problema foi que eu criei meu Dockerfile no bloco de notas e ele anexou automaticamente .txt ao nome do arquivo.
IanGSY
5
Você também pode escrever explicitamente o nome do Dockerfile com o fsinalizador, pois docker build -f Dockerfile-dev.yaml -t my_container .Isso pode ser útil se você tiver vários Dockerfile no seu projeto, um por ambiente, por exemplo. O mesmo se aplica à janela de encaixe-compor. Colocá-los em subdiretórios diferentes não funcionará, pois o context ( .) não corresponderá.
Sumi Straessle
1
@IanGSY Eu gostaria de poder lhe dar mais pontos por isso. Esse foi exatamente o meu problema também!
22717 K. K. Brafford
5
O bloco de notas é um programa excessivamente ruim.
Per Lundberg
98

É uma vergonha!

A mensagem de erro é enganosa. O problema não tem nada a ver com links simbólicos. Geralmente, apenas o docker não consegue encontrar o arquivo Docker descrevendo a compilação.

Razões típicas são estas:

  • Dockerfile tem nome errado .
    Deve ser chamado Dockerfile. Se ele é chamado, por exemplo, dockerfile, .Dockerfile, Dockerfile.txt, ou outro, não vai ser encontrada.
  • O Dockerfile não está no contexto .
    Se você diz docker build contextdir, o Dockerfile deve estar em contextdir/Dockerfile. Se você o tiver, digamos ./Dockerfile, ele não será encontrado.
  • Dockerfile não existe .
    Parece bobagem? Bem, recebi a mensagem de erro acima do meu IC do GitLab depois de escrever um bom Dockerfile, mas esqueci de fazer o check-in. Bobo? Certo. Improvável? Não.

Não é a única vergonha ...

Não apenas essa mensagem de erro é vaga e confusa. Geralmente, acho que alguns dos conceitos de janela de encaixe e grande parte da documentação são semanticamente imprecisos.

Um dos pontos realmente ruins é a noção de "tag" (a partir de agosto de 2019). Dependendo de onde você olha na documentação, está dizendo todas as seguintes coisas (mais ou menos claramente):

  • Existe o tagcomando, mas o argumento que você fornece não é chamado de marca ou nome de marca, é chamado de nome da imagem.
  • Um nome de imagem consiste em um nome de imagem e uma marca, separados por dois pontos.
  • No tagargumento de comando, o nome da marca é opcional, mas o nome da imagem é obrigatório. Óbvio.
  • Nas palavras da página de documentação:
    docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • Mas nem todo o nome da imagem nesse nome é realmente o nome da imagem, porque o nome da imagem pode ser prefixado por um nome de host.
  • Embora algumas vezes essa parte do nome do host seja considerada parte do nome da imagem.
  • De qualquer forma, uma imagem com um nome de host xem (ou antes, mas de alguma forma magicamente sempre se apega a) seu nome de imagem deve então viver nesse host x(em um registro). Se você deseja acessar essa imagem, precisará mais ou menos usar esse nome com o prefixo do host x.
  • Mas uma imagem com esse nome pode estar em qualquer host, e não apenas em x, porque "empurrar" a imagem para xé uma operação separada.
  • Portanto, ver esse nome em uma lista de imagens do docker não significa muito, mas certamente insinuará algo. Às vezes errado.
  • A propósito: mencionei namespaces? Eles podem ir entre o nome do host e o nome da imagem no nome da imagem. E também fazem parte do nome da imagem ou não, dependendo de onde você olha.

Se você está confuso com isso, a culpa não é sua.

Fim do discurso retórico.

Lutz Prechelt
fonte
Penso que esta seria uma resposta muito mais forte (e mais relevante) sem a 2ª parte.
Paul Engrenagem
1
Grande resposta, e obrigado pela informação de fundo
leon
Dica adicional que resolveu meu problema com a mesma mensagem: verifique se o seu CaSinG está correto. Para o caminho do diretório, bem como o Dockerfile. Como o linux é bastante exigente quanto a isso.
RaimondB
38

Se você estiver trabalhando no Windows 8, estará usando a caixa de ferramentas do Docker. No diretório mydockerbuild, execute o comando abaixo, pois seu Dockerfile é um arquivo de texto

docker build -t docker-whale -f ./Dockerfile.txt .
Divyanshu sachdeva
fonte
3
para referência futura, se você precisar fazer isso, é porque o Dockerfile possui uma extensão, enquanto, por padrão, o Docker espera que também não. Definir o arquivo manualmente com a extensão adiciona dores de cabeça desnecessárias. Você deve configurar o Windows Explorer para mostrar extensões e remover a extensão.
11117 Alex
se você estiver acompanhando o tutorial de "introdução" da documentação do docker, você usaria o seguinte:docker build -t friendlyhello -f ./Dockerfile.txt .
Mike Kellogg
É uma semântica realmente ruim que você precisa especificar o nome do arquivo e o caminho fictício também. e / ou sempre nomeie seu arquivo como Dockerfile .. :-(
myloginid 26/03
Isso salvou meu dia. A propósito, estou usando uma máquina Mac. Mas o problema aqui é que o Dockerfile foi criado em um arquivo de texto sem formatação. Obrigado amigo pela ajuda.
Sachidananda Naik 14/09/19
23

O nome do arquivo deve ser Dockerfilee não .Dockerfile. O arquivo não deve ter nenhuma extensão.

SharpCoder
fonte
14

Eu nomeei meu arquivo dockerfile em vez de Dockerfile (em maiúscula), e uma vez que mudei isso, ele começou a processar meu "Dockerfile".

Alan Fitzgerald
fonte
14

Apenas remova a extensão .txt do Dockerfile e execute o comando

docker build -t image-name 

Isso funcionará com certeza.

satya
fonte
9

Eu recebi esse erro (no MacBook), embora tenha usado o comando correto para criar imagem,

docker build -t testimg .

Mais tarde, descobri que o caminho é o problema. Basta navegar para o caminho correto que contém o arquivo docker. Basta verificar o diretório de trabalho atual. Nada de entrar em pânico!

arunprakashpj
fonte
4

No windows 10 ... período é o primeiro parâmetro

docker build . -t docker-whale

PDA
fonte
8
não mais (ou nunca) docker build -t docker-whale .é um comando válido
sebagomez
4

Isso ocorre porque o Bloco de Notas adiciona ".txt" no final do Dockerfile

Aurélien
fonte
4

Na WSL, parece haver um problema com a conversão de caminho. A localização do Dockerfile no Ubuntu (onde estou executando o docker e o Dockerfile vive) é "/ home / sxw455 / App1", mas nenhum desses comandos funcionou:

$ 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

Mas no Windows, o caminho real é:

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

E então eu tive que fazer isso (mesmo que eu o executei do 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.

Eu tive problemas semelhantes com variáveis ​​de ambiente durante a instalação inicial e segui alguns conselhos que diziam para instalar o Windows DockerCE e hackear as variáveis ​​de ambiente em vez de instalar o Ubuntu DockerCE, porque (espero ter me lembrado disso corretamente) que a WSL não implementa completamente systemctl. Depois que a instalação do Windows Docker CE é concluída e as variáveis ​​de ambiente são definidas, o docker funciona bem no WSL / Ubuntu.

Comissário
fonte
Isso funcionou para mim! Instalei apenas o Docker Toolbox e não o instalei na WSL; em vez disso, estou usando os executáveis ​​do Windows diretamente, pois a WSL pode fazer isso agora.
Lawrence Lee
4

Eu criei meu DockerFile pela ferramenta de suporte do Docker VS2017 e tive o mesmo erro. Depois de um tempo, percebi que não estava no diretório correto que contém o Dockerfile (~\source\repos\DockerWebApplication\). cd'ed para o arquivo correto (~/source/repos/DockerWebApplication/DockerWebApplication)que estava dentro do projeto e criou com êxito a imagem do docker.

Hasan
fonte
4

O comando abaixo funcionou para mim docker build -t docker-whale -f Dockerfile.txt.

AMAN BHARDWAJ
fonte
Dockerfile não é um arquivo .txt. Se você o possui como um arquivo .txt, o erro será novamente.
Donald Shahini
3

Duas maneiras de criar um arquivo docker:

Você pode optar por não especificar o nome do arquivo a partir do qual construir e apenas especificá-lo, especificando um caminho (dessa maneira, o nome do arquivo deve estar Dockerfilesem nenhuma extensão anexada, por exemplo:docker build -t docker-whale:tag path/to/Dockerfile

ou

Você pode especificar um arquivo com -fe não importa o que extensão (dentro da razão .txt, .dockerfile, .Dockerfileetc ..) que você decidir usar, por exemplo docker build -t docker-whale:tag /path/to/file -f docker-whale.dockerfile.

PontiusTheBarbarian
fonte
2

Originalmente, eu criei meu Dockerfile no PowerShell e, embora não tenha visto uma extensão no arquivo, ele era mostrado como um tipo de arquivo PS ... depois que criei o arquivo no Notepad ++, certifique-se de selecionar o arquivo "Todos os tipos ( . )" Digite sem extensão no Nome do arquivo (Dockerfile). Isso permitiu que meu comando de criação de imagem fosse concluído com êxito .... Apenas verifique se o Dockerfile possui um Tipo de "Arquivo" ...

Helper7123
fonte
2

O problema é que o nome do arquivo deve ser Dockerfile e não DockerFile ou dockerfile, deve ser D capital seguido por ockerfile em letras minúsculas.

vincent
fonte
2

Certifique-se de que você DOCKERfileesteja na raiz do diretório do aplicativo, eu tinha o meu no src, que resultou nesse erro porque o Docker não estava encontrando o caminho paraDOCKERfile

Frank Odoom
fonte
1

Para criar o Dockerfile, salve o conteúdo automatizado no Dockerfile. não Dockerfile porque ao abrir um comando de arquivo:

$ notepad Dockerfile 

(Um arquivo de texto é gravado para que o arquivo não seja compilado)

Para criar o arquivo, execute:

$ notepad Dockerfile

e agora execute:

$ docker build -t docker-whale .

Verifique se você está no diretório atual do Dockerfile.

niteshkumarmodi
fonte
1

Mais importante, verifique se o nome do seu arquivo é, Dockerfilese você usar outro nome, ele não funcionará (pelo menos não funcionou para mim).

Além disso, se você estiver no mesmo diretório em que o Dockerfile estiver usando a .ie docker build -t Myubuntu1:v1 . ou o caminho absoluto ie docker build -t Myubuntu1:v1 /Users/<username>/Desktop/Docker

ady6831983
fonte
1

No meu caso (executado no Windows 10)
1) Renomeie o arquivo myDockerFile.Dockerfilepara Dockerfile( sem extensão).
Em seguida, execute a partir de fora da pasta este comando:

docker build .\Docker-LocalNifi\ 

Isso está funcionando para mim e para meus colegas de trabalho, espero que também funcione para você

Yohan
fonte
1

Verifique se o nome do arquivo "Dockerfile" não está salvo com nenhuma extensão. Basta criar um arquivo sem qualquer extensão.

E verifique se o Dockerfile está no mesmo diretório de onde você está tentando criar uma imagem do Docker.

Nakesh
fonte
1

Caso tenhamos vários arquivos docker em nosso ambiente, apenas o Dockerfile não será suficiente.

docker build -t ihub -f Dockerfile.ihub .

Portanto, use o filecomando (-f argument) para especificar seu arquivo docker (Dockerfile.ihub)

chethan bhounsley g
fonte
Também é necessário ter o .(ponto) no final da linha, como mostrado acima.
Purplejacket 10/07
A documentação para docker buildestá aqui: docs.docker.com/engine/reference/commandline/build
Purplejacket
0

Eu peguei isso no Windows quando o caminho em que eu estava trabalhando estava em um diretório Junction. Então, minha solução foi não funcionar nesse caminho.

Chris F Carroll
fonte
0

No Mac, ele funciona para o comando abaixo. (espero que você .Dockerfileesteja no seu diretório raiz).

docker build -t docker-whale -f .Dockerfile .
Chanaka Caldera
fonte
0

O problema está relacionado ao procedimento de criação do DockerFile.

Para funcionar, abra cmd, cd no diretório de interesse e digite:

abc>DockerFile

Isso criará um arquivo chamado DockerFile dentro da sua pasta.

Agora digite:

notepad DockerFile 

Isso abrirá o arquivo DockerFile no bloco de notas e você precisará copiar / colar o código padrão fornecido.

Salve o arquivo e agora, finalmente, crie sua imagem com o Docker digitando:

docker build -t docker-whale . 

Isso está funcionando para mim e espero que ajude outras pessoas

Empregado
fonte
0

Eu criei erroneamente Dockerfile.txtno meu diretório de trabalho levando ao erro acima mencionado enquantobuild

A correção foi remover a .txtextensão do arquivo.

O nome do arquivo deve estar Dockerfileapenas sem nenhuma extensão .

iCantC
fonte
0

Execute docker build -t getting-started .no diretório do projeto e verifique se o Dockerfile está presente e sem .txtextensão. Se você estiver no Windows, verifique a 'extensão do nome do arquivo' na guia Exibir no Explorador de Arquivos para mostrar se .txt existe ou não e remova-o se o primeiro for verdadeiro. Boa sorte.

Abdellah Ramadan
fonte
0

Eu também enfrentei os mesmos problemas e foi resolvido quando criei o arquivo chamado DockerFile e mencionei todo o comando que queria ser executado durante a criação de qualquer imagem.

Yoshita Mahajan
fonte
0

O erro significa que docker buildestá usando uma PATH | URLentrada incorreta ou que Dockerfilenão pode ser encontrada no diretório atual. Além disso, verifique se, ao executar o comando a partir de um terminal integrado (por exemplo, bashdentro do seu IDE ou editor de texto), você tem as permissões de administrador para fazê-lo. Melhor se você puder verificar a PATHpartir do seu terminal com pwd(no bash shellou dirse estiver usando um simples clino Windows) e copiar o caminho exato onde deseja que a imagem seja criada.

docker build C:\windows\your_amazing_directory

docker build --help também mostrará as opções disponíveis para uso em caso de comandos malformados ou ilegais.

rags2riches
fonte
-1

Eu tentei isso e funcionou:

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

Por favor, veja aspas + aspas em torno do nome da pasta

Nota: Na pasta "C:\Users\ssundarababu\Documents\Docker\Learn\SimpleDockerfile"eu tenho meu Dockerfile.

Sudharsan S
fonte
-1

Para criar uma imagem da linha de comando no Windows / Linux. 1. Crie um arquivo de janela de encaixe no seu diretório atual. por exemplo: DO ubuntu, execute o apt-get update, execute o apt-get -y install apache2 ADD. / var / www / html ENTRYPOINT apachectl -D FOREGROUND ENV nome Devops_Docker 2. Não salve com a extensão .txt. 3. Na linha de comandos, execute a construção da janela de encaixe. -t apache2image

Udit Gandhi
fonte