COPIAndo un archivo en un Dockerfile, ¿no existe tal archivo o directorio?

94

Tengo un Dockerfile configurado en mi carpeta raíz (~). Las primeras tres líneas de mi archivo se ven así:

COPY file1 /root/folder/
COPY file2 /root/folder/
COPY file3 /root/folder/

pero devuelve el siguiente error para cada línea:

El fichero o directorio no existe

Los archivos están en el mismo directorio que mi Dockerfile y también estoy ejecutando el comando docker build - < Dockerfileen el mismo directorio en la terminal.

¿Qué estoy haciendo mal aquí exactamente?

GreenGodot
fuente
Tuve este problema, luego noté que el archivo .dockerignore ignoraba el archivo que estaba tratando de copiar. Solución de jinschubert: github.com/docker/for-mac/issues/1922
JStrahl

Respuestas:

35

La instrucción COPY en Dockerfilecopia los archivos en srcla destcarpeta. Parece que están perdidos el file1, file2y file3o tratando de construir el Dockerfilede la carpeta equivocada.

Consulte el documento de Dockerfile

Además, el comando para construir Dockerfiledebería ser algo así como.

cd into/the/folder/
docker build -t sometagname .
preguntarb
fuente
3
Ese segundo comando me falla, dice que "construir" requiere un argumento.
GreenGodot
oh - actualice el cmd ahora, no es necesario mencionar el Dockerfile.
askb
3
Después de leer correctamente su enlace, descubrí que DockerFile no debería estar en la carpeta raíz. Moví todo al subdirectorio, ejecutó el comando de compilación y se ejecuta. Su respuesta fue muy útil, así que la marcaré como correcta.
GreenGodot
47
También verifique si hay (no) un archivo Docker Ignore.
Tony
249

Verifique el .dockerignorearchivo también.

Sé que este es un caso muy raro, pero ese archivo se menciona allí.

Swateek
fuente
3
Oh dios mío, gracias. Estaba cambiando el nombre de un proyecto Java (y por lo tanto, el directorio de artefactos y compilación), y ripgrepno busco en archivos de puntos, así que no vi la última referencia molesta al directorio anterior.
Martin Lehmann
4
gracias por el aviso, en mi caso estaba usando visual studio wizard para docker y agregó un .dockerignore con * en la primera línea :(
lacripta
Por alguna razón, mi .dockerignore predeterminado tiene ** \ bin. Estoy seguro de que fue generado por el escritorio de Docker.
Steve Smith
¡¡¡ahhghgghghg no parece un caso tan raro después de todo !!!. No lo habría descubierto en un millón de años. Agregué el directorio hace un tiempo y lo olvidé por completo. La razón para agregarlo es que hace que cualquier compilación sea extremadamente lenta, creo que tiene que ver con git ...
tahiche
1
oh, en serio, qué error es ese. muchas gracias por señalar eso!
TaiBsu
36

Posiblemente se deba a que está refiriendo file1 / file2 / file3 como una ruta absoluta que no está en el contexto de compilación, Docker solo busca la ruta en el contexto de compilación.

Por ejemplo, si usa COPY / home / yourname / file1, Docker build lo interpreta como $ {docker build working directory} / home / yourname / file1, si no hay ningún archivo con el mismo nombre aquí, no se produce ningún error de archivo o directorio.

Consulte uno de los problemas de la ventana acoplable

Popeye
fuente
hay algún tipo de problema de ruta absoluta, solo puedo "COPIAR relativa / ruta / x". No puedo "COPIA / absoluta / ruta / a.", ¿Alguien sabe por qué?
Alexander Mills
8
Se supone que @AlexanderMills Dockerfiles se pueden ejecutar de forma independiente en la máquina host y se envían con archivos adicionales disponibles en rutas relativas a Dockerfile. El uso de rutas absolutas lo haría ejecutable solo en su máquina.
kciesielski
Ese también fue mi problema con la ADDdirectiva, gracias.
vmonteco
No sabía esto. Cambiarlo para que el archivo se incluyera junto con el archivo docker realmente funcionó perfectamente para mí. Cuando lo tenía desde otra ubicación de origen (como una ruta completa, por ejemplo, / dir / dir2 / file), no funcionaba. Funciona si está en algún directorio como el archivo docker o si es
secundario
22

Parece que los comandos:

docker build -t imagename .

y:

docker build -t imagename - < Dockerfile2

no se ejecutan de la misma manera. Si desea crear 2 imágenes de la ventana acoplable desde una carpeta con Dockerfile y Dockerfile2, el comando COPY no se puede usar en el segundo ejemplo usando stdin (<Dockerfile2). En su lugar, debes usar:

docker build -t imagename -f Dockerfile2 .

Entonces COPY funciona como se esperaba.

Tallandtree
fuente
16

La ejecución docker build . -f docker/development/Dockerfilefuncionó, lo que le permite ejecutar su archivo de Docker desde un directorio específico que no sea la raíz de su aplicación.

Utilice -fo --filepara especificar el nombre y la ubicación del Dockerfile.

Esto me sucedió al intentar ejecutar el archivo de la ventana acoplable desde un directorio diferente.

Tenía el COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directoryy logré resolver esto especificando el archivo de la ventana acoplable.

Fue lo docker build docker/development/Dockerfileque me causó este problema.

Lo encontré extraño al principio porque cuando lo tenía Dockerfileen el directorio raíz de las aplicaciones, funcionó bien. Esto ayudará si desea administrar los archivos de la ventana acoplable de su entorno un poco mejor.

Una estrella
fuente
1
docker build . -f docker/development/Dockerfileesto funciona
Pradeep Surale
1
Muchas gracias, esto también funcionó para mí. Me estaba volviendo loco.
x0n
4

Acabo de experimentar este problema y ninguna de las sugerencias aquí resolvió mi problema. Resulta que tenía los finales de línea incorrectos en mi archivo y tuve que cambiarlos por los finales de línea apropiados. (En este caso de CRLF a LF, por lo que Ubuntu 14.04 reconocería el script, que había estado editando en Windows).

Cambié los finales de línea usando VSCode, y la mayoría de los editores de código deberían tener la opción de elegir finales de línea.

Espero que esto ayude a alguien.

LiHRaM
fuente
Sí, ayudó :)
Robert Smith
3

Me siento un poco estúpido, pero mi problema era que estaba ejecutando docker-compose y mi Dockerfile estaba en un subdirectorio ./deploy. Mi referencia ADD debía ser relativa a la raíz del proyecto, no al Dockerfile.

Cambiado: AÑADIR ./archivo.tar.gz / etc / carpeta / a: AÑADIR ./deploy/file.tar.gz / etc / carpeta /

De todos modos, pensé en publicar en caso de que alguien tuviera el mismo problema.

fufonzo
fuente
3

Aquí está la solución y la mejor práctica:

Necesita crear una carpeta de recursos donde pueda guardar todos los archivos que desea copiar.

├── Dockerfile
│   └── resources
│       ├── file1.txt
│       ├── file2.js

El comando para copiar archivos debe especificarse de esta manera:

COPY resources /root/folder/

dónde

* recursos : su carpeta local que creó en la misma carpeta donde está Dockerfile

* / root / folder / - carpeta en su contenedor

Anna van den Akker
fuente
1

Para el siguiente error,

COPY failed: stat /<**path**> :no such file or directory

Lo logré reiniciando el servicio Docker.

sudo service docker restart
Vineeth
fuente
1

Error de archivo no encontrado con Docker put_archive. Estoy usando la API de Python para Docker. Docker versión 1.12.5, compilación 7392c3b

docker.errors.NotFound: 404 Client Error: Not Found ("lstat /var/lib/docker/aufs/mnt/39d58e00519ba4171815ee4444f3c43d2c6a7e285102747398f6788e39ee0e87/var/lib/neo4j/certificates: no such file or directory")

No puedo copiar archivos en un contenedor de ventana acoplable creado.

con = cli.create_container(...)
cli.put_archive(...)
cli.start(con['Id'])

Si cambio el orden de operación, no hay error y los archivos se copian exactamente donde los quiero. Entonces sé que mi código está funcionando y haciendo lo que quiero que haga. Pero es importante copiar los archivos de configuración a un contenedor antes de que se inicie. Hacer frente a los archivos después del inicio hace que el contenedor comience con una configuración predeterminada y no la configuración personalizada que debe copiarse en su lugar antes de que se inicie el contenedor. Docker afirma que este problema está cerrado, pero aún afecta a mi aplicación.

Esto funciona; Mismo código diferente orden de ejecución.

con = cli.create_container(...)
cli.start(con['Id'])
cli.put_archive(...)
metadatos
fuente
1

Si está seguro de haber hecho lo correcto, pero Docker aún se queja, eche un vistazo a este problema: https://github.com/moby/moby/issues/27134 .
Esto me quemó y parece que reiniciar el motor de la ventana acoplable service docker restartsolucionará este problema.

linehrr
fuente
1

Estaba buscando una solución a esto y la carpeta que estaba AGREGANDO o COPIANDO no estaba en la carpeta de compilación, varios directorios arriba o referenciados desde /

Mover la carpeta desde fuera de la carpeta de compilación a la carpeta de compilación solucionó mi problema.

frambuesa
fuente
1

una de las formas de no usar stdin y mantener el contexto es:

1) en su Dockerfile, debe agregar

ADD /your_dir_to_copy /location_in_container

2) después, debe ir al padre de / your_dir_to_copy dir

2) luego ejecute este comando

sudo docker build . -t (image/name) -f path_of_your_dockerfile/Dockerfile

3) después de crear su contenedor

docker run -ti --rm cordova bash

4) Después de que obtenga su directorio copiado en su contenedor

Walterwhites
fuente
1

Es posible que las llamadas anteriores en COPY estén cambiando el directorio.

COPY ./server/package.json ./server      # this passes, but the dest ./server is considered a file

COPY ./server/dist ./server/dist         # error, ./server/dist is not a directory

Agregar una barra al final a la primera llamada

COPY ./server/package.json ./server/
Isaac Pak
fuente
1

Me encontré con esto. Copiar algunos directorios no funcionó. Copiar archivos lo hizo. Resultó ser porque los archivos contenidos en .gitignore (no solo .dockerignore) también se ignoran. Ver: https://github.com/zeit/now/issues/790

José Solórzano
fuente
docenas de referencias para COPY que no se copian - esta es una de las pocas a las que se hace referencia .dockerignorecomo culpable
Alvin
1

Sé que esto es antiguo, pero algo que señalar. Si crees que todo es como se supone, revisa tu archivo .gitignore :)

Es posible que tenga la carpeta localmente, pero si la carpeta está en su git ignore entonces no está en el servidor, lo que significa que Docker no puede encontrar esa carpeta porque no existe.

TSlegaítis
fuente
1

Similar y gracias a la respuesta de tslegaitis , después

gcloud builds submit --config cloudbuild.yaml . 

muestra

Check the gcloud log [/home/USER/.config/gcloud/logs/2020.05.24/21.12.04.NUMBERS.log] to see which files and the contents of the
default gcloudignore file used (see `$ gcloud topic gcloudignore` to learn
more).

Al verificar ese registro, dice que Docker usará .gitignore:

DATE Using default gcloudignore file:
# This file specifies files that are *not* uploaded to Google Cloud Platform
# using gcloud. It follows the same syntax as .gitignore, with the addition of
# "#!include" directives (which insert the entries of the given .gitignore-style
# file at that point).
# ...

.gitignore

Así que arreglé mi .gitignore(lo uso como lista blanca en su lugar) y Docker copió el archivo.

[Agregué la respuesta porque no tengo suficiente reputación para comentar]

Omr
fuente
1

Tuve este problema a pesar de que mi directorio de origen estaba en el contexto de compilación correcto. Descubrí que la razón fue que mi directorio de origen era un enlace simbólico a una ubicación fuera del contexto de compilación.

Por ejemplo, mi Dockerfile contiene lo siguiente:

COPY dir1 /tmp

Si dir1es un enlace simbólico, el COPYcomando no funciona en mi caso.

algojohn
fuente
0

Así que esto ha sucedido un par de veces recientemente. Como desarrollador de .Net, usando VisualStudio cambié mi nombre de compilación de SomeThinga Somethingcomo el nombre de DLL, pero esto no cambia el archivo .csproj que permaneceSomeThing.csproj

El Dockerfile usa nombres de archivo linux que distinguen entre mayúsculas y minúsculas, por lo que el Dockerfile recién generado automáticamente estaba tratando de copiar Something.csproj que no podía encontrar. Así que cambiar el nombre de ese archivo manualmente (haciéndolo en minúsculas) hizo que todo funcionara

Pero ... aquí hay una advertencia de precaución. Este cambio de nombre de archivo en mi computadora portátil con Windows no es recogido por Git, por lo que la fuente del repositorio todavía estaba SomeThing.csprojen el repositorio y durante el proceso de CI / CD, la compilación de Docker falló por las mismas razones ...

Tuve que cambiar el nombre del archivo directamente como una confirmación en el repositorio ... una pequeña solución desagradable, pero me puso en marcha

tl; dr Si en Windows O / S verifique la distinción entre mayúsculas y minúsculas en el nombre de archivo y tenga en cuenta que los cambios de nombre de archivos locales no se recogen como cambio de Git, así que asegúrese de que su repositorio también se modifique si usa CI / CD

Cielo
fuente
0

Algunas buenas respuestas aquí ya. Lo que funcionó para mí fue mover los comentarios a la siguiente línea.

MALO :

WORKDIR /tmp/app/src # set the working directory (WORKDIR), so we can reference program directly instead of providing the full path.
COPY src/ /tmp/app/src/ # copy the project source code

BUENO :

WORKDIR /tmp/app/src
  # set the working directory (WORKDIR), so we can reference program directly instead of providing the full path.
COPY src/ /tmp/app/src/
  # copy the project source code
Aleksandras Urbonas
fuente