Docker: no se puede preparar el contexto: no se pueden evaluar los enlaces simbólicos en la ruta del Dockerfile: GetFileAttributesEx

189

Acabo de descargar Docker Toolbox para Windows 10 de 64 bits hoy. Estoy pasando por el tutorial. Recibo el siguiente error cuando intento construir una imagen usando un Dockerfile.

Pasos:

  • Lanzamiento de la terminal de inicio rápido de Docker.
  • Testdocker después de crearlo.
  • Prepare Dockerfile como se documenta en el enlace web "Cree su propia imagen"
  • corrió debajo del 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.

Por cierto: probé varias opciones mencionadas en 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
fuente
44
Actualización: docker build -t XXX --file ./Dockefile. trabajó. Docker puede querer actualizar su documentación para usuarios de Windows.
villanux
44
Si docker build -t XXX --file ./Dockefilepuede ser porque te equivocaste en el nombre del archivo, le falta la R.
eXa
17
Este es un mensaje de error increíblemente malo, solo significa "no se puede abrir el archivo", lo mismo en Linux y macOS.
RichVel
Mensaje de error alucinantemente malo.
Expiación limitada el

Respuestas:

205

mientras ejecuta el siguiente comando:

docker build -t docker-whale .

compruebe que Dockerfile esté presente en su directorio de trabajo actual.

kalyani chaudhari
fuente
28
Gracias. Mi problema fue que había creado mi Dockerfile en el Bloc de notas y había agregado automáticamente .txt al nombre del archivo.
IanGSY
55
También puede escribir explícitamente el nombre de Dockerfile con el findicador, como en docker build -f Dockerfile-dev.yaml -t my_container .Esto puede resultar útil si tiene varios Dockerfile en su proyecto, uno por entorno, por ejemplo. Lo mismo se aplica a docker-compose. Ponerlos en diferentes subdirectorios no funcionará, ya que el contexto ( .) no coincidirá.
Sumi Straessle
1
@IanGSY Ojalá pudiera darte más puntos por eso. ¡Ese fue exactamente mi problema también!
K. Brafford
55
El Bloc de notas es un programa excesivamente malvado.
Según Lundberg el
98

¡Es una pena!

El mensaje de error es engañoso. El problema no tiene nada que ver con los enlaces simbólicos realmente. Por lo general, es solo que Docker no puede encontrar el Dockerfile que describe la compilación.

Las razones típicas son estas:

  • Dockerfile tiene un nombre incorrecto .
    Debe ser llamado Dockerfile. Si se le llama, por ejemplo, dockerfile, .Dockerfile, Dockerfile.txt, o de otro tipo, no va a ser encontrado.
  • Dockerfile no está en contexto .
    Si dices docker build contextdir, el Dockerfile debe estar en contextdir/Dockerfile. Si lo tiene adentro, por ejemplo, ./Dockerfileno se encontrará.
  • Dockerfile no existe en absoluto .
    ¿Suena tonto? Bueno, recibí el mensaje de error anterior de mi GitLab CI después de haber escrito un buen Dockerfile, pero olvidé revisarlo. ¿Tonto? Por supuesto. ¿Improbable? No.

No es la única vergüenza ...

No solo este mensaje de error es vago y confuso. Generalmente encuentro que algunos de los conceptos de Docker y gran parte de la documentación son semánticamente imprecisos.

Uno de los puntos realmente malos es la noción de "etiqueta" (a partir de agosto de 2019). Dependiendo de dónde mire en la documentación, está diciendo todas las siguientes cosas (más o menos claramente):

  • Existe el tagcomando, pero el argumento que proporciona no se llama etiqueta o nombre de etiqueta, se llama nombre de imagen.
  • El nombre de una imagen consiste en un nombre de imagen y una etiqueta, separados por dos puntos.
  • En el tagargumento del comando, el nombre de la etiqueta es opcional pero el nombre de la imagen es obligatorio. Obvio.
  • En palabras de la página de documentación:
    docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • Pero no todo el nombre de la imagen en ese nombre de imagen es en realidad el nombre de la imagen, porque el nombre de la imagen puede tener como prefijo un nombre de host.
  • Aunque a veces esa parte del nombre de host se considera parte del nombre de la imagen.
  • En cualquier caso, una imagen con un nombre de host xen (o antes, pero de alguna manera mágicamente siempre aferrándose a) su nombre de imagen se supone que vive en ese host x(en un registro). Si desea acceder a dicha imagen, más o menos tiene que usar este nombre con el prefijo del host x.
  • Pero una imagen con ese nombre puede vivir en cualquier host, no solo en él x, porque "empujar" la imagen xes una operación separada.
  • Entonces, ver ese nombre en una lista de imágenes de Docker no significa mucho, pero seguramente insinuará algo. A veces equivocadamente.
  • Por cierto: ¿mencioné espacios de nombres? Pueden ir entre el nombre de host y el nombre de la imagen en el nombre de la imagen. Y también son parte del nombre de la imagen o no, dependiendo de dónde se mire.

Si usted está confundido por esto, es que no tienes la culpa.

Fin de la diatriba.

Lutz Prechelt
fuente
Creo que esto sería una respuesta mucho más fuerte (y más relevante) sin la segunda mitad.
Paul Gear
1
Gran respuesta, y gracias por la información de fondo
Leon
Sugerencia adicional que resolvió mi problema con el mismo mensaje: asegúrese de tener su CaSinG correcta. Para la ruta del directorio, así como el Dockerfile. Dado que Linux es bastante exigente con eso.
RaimondB
38

Si está trabajando en Windows 8, estaría usando Docker toolbox. Desde el directorio mydockerbuild, ejecute el siguiente comando, ya que su Dockerfile es un archivo de texto

docker build -t docker-whale -f ./Dockerfile.txt .
Divyanshu sachdeva
fuente
3
para futuras referencias si necesita hacer esto es porque su Dockerfile tiene una extensión, mientras que Docker por defecto no lo espera también. Configurar el archivo manualmente con la extensión agrega dolores de cabeza que no necesita. Debe configurar el explorador de Windows para mostrar extensiones y luego eliminar la extensión.
Alex
si sigues el tutorial de "iniciación" de la documentación de la ventana acoplable, usarías esto:docker build -t friendlyhello -f ./Dockerfile.txt .
Mike Kellogg
Su semántica realmente mala es que también debe especificar el nombre del archivo y la ruta ficticia. y / o siempre nombre su archivo como Dockerfile .. :-(
myloginid
Esto me salvó el día. Por cierto, estoy usando una máquina Mac. Pero el problema aquí es que el Dockerfile se creó un archivo de texto sin formato. Gracias amigo por la ayuda.
Sachidananda Naik
23

El nombre del archivo debe ser Dockerfiley no .Dockerfile. El archivo no debe tener ninguna extensión.

SharpCoder
fuente
14

Había nombrado mi archivo dockerfile en lugar de Dockerfile (en mayúscula), y una vez que lo cambié, comenzó a procesar mi "Dockerfile".

Alan Fitzgerald
fuente
14

Simplemente elimine la extensión .txt de Dockerfile y ejecute el comando

docker build -t image-name 

Funcionará seguro.

satya
fuente
9

Tengo este error (en MacBook) aunque utilicé el comando correcto para crear la imagen,

docker build -t testimg .

Más tarde encontré que el camino es el problema. Simplemente navegue a la ruta correcta que contiene el archivo acoplable. Simplemente revise su directorio de trabajo actual. ¡Nada de pánico!

arunprakashpj
fuente
4

En Windows 10 ... el período es el primer parámetro

docker build . -t docker-whale

PDA
fuente
8
no más (o nunca) docker build -t docker-whale .es un comando válido
sebagomez
4

Eso es solo porque el Bloc de notas agrega ".txt" al final de Dockerfile

Aurélien
fuente
4

En WSL, parece haber un problema con la conversión de ruta. La ubicación del Dockerfile en Ubuntu (donde estoy ejecutando docker y donde vive Dockerfile) es "/ home / sxw455 / App1", pero ninguno de estos comandos funcionó:

$ 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

Pero en Windows, la ruta real es:

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

Y entonces tuve que hacer esto (aunque lo ejecuté desde 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.

Tuve problemas similares con las variables de entorno durante la instalación inicial, y seguí algunos consejos que decían instalar Windows DockerCE y piratear las variables de entorno en lugar de instalar Ubuntu DockerCE, porque (espero recordar esto correctamente) que WSL no se implementa completamente systemctl. Una vez que se realiza la instalación de Windows Docker CE y se establecen las variables de entorno, Docker funciona bien en WSL / Ubuntu.

Comisario
fuente
¡Esto funcionó para mí! Solo instalé Docker Toolbox y no lo instalé en WSL; en cambio, estoy usando los ejecutables de Windows directamente, ya que WSL puede hacerlo ahora.
Lawrence Lee
4

Había creado mi DockerFile por la herramienta VS2017 Docker Support y tuve el mismo error. Después de un tiempo, me di cuenta de que no estaba en el directorio correcto que contiene el Dockerfile (~\source\repos\DockerWebApplication\). Cd'ed al archivo correcto (~/source/repos/DockerWebApplication/DockerWebApplication)que estaba dentro del proyecto y creó con éxito la imagen del acoplador.

Hasan
fuente
4

El siguiente comando funcionó para mí docker build -t docker-whale -f Dockerfile.txt.

AMAN BHARDWAJ
fuente
Dockerfile no es un archivo .txt. Si lo tiene como un archivo .txt, le dará error nuevamente.
Donald Shahini el
3

Dos formas de construir un dockerfile:

Puede decidir no especificar el nombre del archivo desde el cual construir y simplemente compilarlo especificando una ruta (de esta manera, el nombre del archivo debe estar Dockerfilesin extensión añadida, por ejemplo:docker build -t docker-whale:tag path/to/Dockerfile

o

Se puede especificar un archivo con -fy no importa lo que la extensión (dentro de lo razonable .txt, .dockerfile, .Dockerfileetc ..) que decida usar, por ejemplo docker build -t docker-whale:tag /path/to/file -f docker-whale.dockerfile.

PoncioEl bárbaro
fuente
2

Originalmente había creado mi Dockerfile en PowerShell y, aunque no vi una extensión en el archivo, se mostró como un Tipo de archivo PS ... una vez que creé el archivo desde Notepad ++, asegúrese de seleccionar el archivo "Todos los tipos ( . )" Escriba sin extensión en el Nombre de archivo (Dockerfile). Eso permitió que mi comando de creación de imágenes se completara correctamente ... Solo asegúrese de que su Dockerfile tenga un Tipo de "Archivo" ...

Helper7123
fuente
2

El problema es que el nombre del archivo debe ser Dockerfile y no DockerFile o dockerfile, debe ser D mayúscula seguido de ockerfile en minúsculas.

vincent
fuente
2

Asegúrese de que DOCKERfileesté en la RAÍZ del directorio de la aplicación, tuve la mía en src que resultó en este error porque Docker no estaba encontrando la ruta aDOCKERfile

Frank Odoom
fuente
1

Para construir Dockerfile, guarde contenido automatizado en Dockerfile. no Dockerfile porque al abrir un comando de archivo:

$ notepad Dockerfile 

(Se escribe un archivo de texto para que el archivo no se pueda construir)

Para construir el archivo ejecute:

$ notepad Dockerfile

y ahora corre:

$ docker build -t docker-whale .

Asegúrese de estar en el directorio actual de Dockerfile.

niteshkumarmodi
fuente
1

Lo más importante es asegurarse de que su nombre de archivo sea Dockerfilesi usa otro nombre que no funcionará (al menos no lo hizo para mí).

Además, si está en el mismo directorio donde el Dockerfile es use un .ie docker build -t Myubuntu1:v1 . o use la ruta absoluta ie docker build -t Myubuntu1:v1 /Users/<username>/Desktop/Docker

ady6831983
fuente
1

I my case (ejecutado desde Windows 10)
1) Cambie el nombre del archivo myDockerFile.Dockerfilea Dockerfile( sin extensión de archivo).
Luego ejecute desde fuera de la carpeta este comando:

docker build .\Docker-LocalNifi\ 

Esto está funcionando para mí y para mis colegas en el trabajo, espero que también funcione para usted.

Yohan
fuente
1

Asegúrese de que el nombre de archivo "Dockerfile" no esté guardado con ninguna extensión. Simplemente cree un archivo sin ninguna extensión.

Y asegúrese de que Dockerfile esté en el mismo directorio desde el que está tratando de construir la imagen de Docker.

Nakesh
fuente
1

En caso de que tengamos varios archivos acoplables en nuestro entorno, solo Dockerfile no será suficiente.

docker build -t ihub -f Dockerfile.ihub .

Por lo tanto, use el filecomando (argumento -f) para especificar su archivo acoplable (Dockerfile.ihub)

chethan bhounsley g
fuente
También es necesario tener el .(punto) al final de la línea, como se muestra arriba.
Purplejacket
La documentación para docker buildestá aquí: docs.docker.com/engine/reference/commandline/build
Purplejacket
0

Obtuve esto en Windows cuando la ruta en la que estaba trabajando estaba bajo un directorio de Junction. Entonces mi solución fue no trabajar bajo ese camino.

Chris F Carroll
fuente
0

En Mac funciona para el siguiente comando. (Espero que .Dockerfileesté en su directorio raíz).

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

El problema está relacionado con el procedimiento de creación de DockerFile.

Para trabajar, abra cmd, cd en el directorio de interés y escriba:

abc>DockerFile

Esto creará un archivo llamado DockerFile dentro de su carpeta.

Ahora escriba:

notepad DockerFile 

Esto abrirá el archivo DockerFile en el bloc de notas y tendrá que copiar / pegar el código estándar proporcionado.

Guarde el archivo y ahora, finalmente, cree su imagen con Docker escribiendo:

docker build -t docker-whale . 

Esto está funcionando para mí y espero que ayude a otros

Empleado
fuente
0

Creé erróneamente Dockerfile.txten mi directorio de trabajo que condujo al error mencionado anteriormente mientrasbuild

La solución fue eliminar la .txtextensión del archivo.

El nombre del archivo debe estar Dockerfilesolo sin ninguna extensión .

iCantC
fuente
0

Ejecute docker build -t getting-started .en el directorio de su proyecto y asegúrese de que Dockerfile esté presente y no tenga .txtextensión. Si está en Windows, verifique la 'extensión de nombre de archivo' en la pestaña debajo de la vista en el Explorador de archivos para mostrar si .txt está allí o no, y elimínelo si el primero es verdadero. Buena suerte.

Abdellah Ramadan
fuente
0

También enfrenté los mismos problemas y se resolvió cuando creé un archivo con DockerFile y mencioné todos los comandos que deseaban ejecutarse durante la creación de cualquier imagen.

Yoshita Mahajan
fuente
0

El error significa que docker buildestá utilizando una PATH | URLentrada incorrecta o que Dockerfileno se puede encontrar en el directorio actual. Además, asegúrese de que cuando ejecute el comando desde un terminal integrado (por ejemplo, bashdentro de su IDE o editor de texto) tenga los permisos de administrador para hacerlo. Es mejor si puede verificar PATHdesde su terminal con pwd(en bash shello dirsi está usando un simple clien Windows) y copiar la ruta exacta donde desea que se construya la imagen.

docker build C:\windows\your_amazing_directory

docker build --help también le mostrará las opciones disponibles para usar en caso de comandos malformados o ilegales.

rags2riches
fuente
-1

Intenté esto y funcionó:

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

Consulte las comillas y las comillas alrededor del nombre de la carpeta.

Nota: En la carpeta "C:\Users\ssundarababu\Documents\Docker\Learn\SimpleDockerfile"tengo mi Dockerfile.

Sudharsan S
fuente
-1

Para construir una imagen desde la línea de comandos en windows / linux. 1. Cree un archivo acoplable en su directorio actual. por ejemplo: DESDE ubuntu EJECUTAR apt-get update EJECUTAR apt-get -y instalar apache2 ADD. / var / www / html ENTRYPOINT apachectl -D FOREGROUND ENV name Devops_Docker 2. No lo guarde con la extensión .txt. 3. En la línea de comandos, ejecute el comando docker build. -t apache2image

Udit Gandhi
fuente