Problema de Docker COPY: "no existe tal archivo o directorio"

38

En mi Dockerfile tengo la siguiente declaración 'COPY ":

# Copy app code
COPY /srv/visitor /srv/visitor

No debería decir que en mi sistema host, bajo el directorio "/ srv / visitor", existe mi código fuente:

[root@V12 visitor]# ls /srv/visitor/
Dockerfile  package.json  visitor.js

Ahora, cuando trato de construir una imagen usando este Dockerfile, se cuelga en el paso cuando se supone que "COPIA" tiene lugar:

Step 10 : COPY /srv/visitor /srv/visitor
INFO[0155] srv/visitor: no such file or directory

Dice que no existe tal directorio, pero claramente lo hay.

¿Algunas ideas?

ACTUALIZACIÓN 1:

Me han señalado que me equivoqué, en la forma en que entendí el contexto de construcción. La sugerencia equivalía a cambiar la declaración de "COPIA" a esto:

COPY . /srv/visitor

El problema es que lo tuve de esta manera, y el proceso de compilación se detuvo en el siguiente paso:

RUN npm install

Decía algo parecido a "no se encontró el archivo package.json", cuando claramente hay uno.

ACTUALIZACIÓN 2:

Intenté ejecutarlo con este cambio en el Dockerfile:

COPY source /srv/visitor/

Se detuvo al intentar ejecutar npm:

Step 12 : RUN npm install
 ---> Running in ae5e2a993e11
npm ERR! install Couldn't read dependencies
npm ERR! Linux 3.18.5-1-ARCH
npm ERR! argv "/usr/bin/node" "/usr/sbin/npm" "install"
npm ERR! node v0.10.36
npm ERR! npm  v2.5.0
npm ERR! path /package.json
npm ERR! code ENOPACKAGEJSON
npm ERR! errno 34

npm ERR! package.json ENOENT, open '/package.json'
npm ERR! package.json This is most likely not a problem with npm itself.
npm ERR! package.json npm can't find a package.json file in your current directory.

npm ERR! Please include the following file with any support request:
npm ERR!     /npm-debug.log
INFO[0171] The command [/bin/sh -c npm install] returned a non-zero code: 34

Entonces, ¿se ha realizado la copia? En caso afirmativo, ¿por qué npm no puede encontrar package.json?

dsljanus
fuente
Para aquellos que buscan un problema en 2017, este puede ser su problema github.com/docker/for-mac/issues/1922 . recomienda eliminar el archivo .dockerignore y volver a probar. Si eso funciona, puede jugar con su configuración en .dockerignore para resolver el problema.
Indefinido el

Respuestas:

36

De la documentación:

La <src>ruta debe estar dentro del contexto de la compilación ; no puede COPIAR ... / algo / algo, porque el primer paso de una compilación de docker es enviar el directorio de contexto (y subdirectorios) al demonio de docker.

Cuando usa /srv/visitor, está usando una ruta absoluta fuera del contexto de compilación, incluso si en realidad es el directorio actual.

Es mejor que organice su contexto de construcción de esta manera:

├── /srv/visitor
│   ├── Dockerfile
│   └── resources
│       ├── visitor.json
│       ├── visitor.js

Y use :

COPY resources /srv/visitor/

Nota:

docker build - < Dockerfile No tiene ningún contexto.

De ahí el uso,

docker build .

Xavier Lucas
fuente
Ya estoy dentro del directorio "/ srv / visitor" de mi sistema host, y todo mi código fuente, más el Dockerfile, está aquí. ¿Cómo debo escribir mi declaración "COPY" para que toda esta fuente se copie dentro del directorio "/ srv / visitor" del contenedor?
dsljanus
1
@dsljanus El directorio o archivo fuente debe ser relativo al contexto de compilación, es decir, el /srv/visitordirectorio.
Xavier Lucas
Entonces, ¿debería ser "."? Porque lo tenía así, y el proceso de compilación se detuvo en el siguiente paso, "RUN npm install". Decía algo parecido a "no se encontró el archivo package.json". Por favor vea mi actualización también.
dsljanus
2
@dsljanus ¿Y de dónde estás ejecutando npm? Publique todo su dockerfile ... Por cierto, no modifique varias actualizaciones como esta en las preguntas, es realmente molesto pasar de un problema a otro completamente diferente. El propósito de SF es publicar preguntas claras para obtener respuestas claras.
Xavier Lucas
1
@dsljanus Ok, ese es el problema, no lo use, RUN cdpero use WORKDIRpara que el directorio actual se recuerde entre cada paso. Un dockerfile no es más que un contenedor para docker run + docker commit, por lo que cada paso se ejecuta de forma independiente sobre la capa anterior. Esto significa que pwd es igual /en cada paso si no usa esta directiva.
Xavier Lucas
41

Para mí, el directorio estaba en el contexto correcto, solo que estaba incluido en el .dockerignorearchivo (oculto) en la raíz del proyecto. Esto lleva al mensaje de error:

lstat mydir/myfile.ext: no such file or directory
AlcaDotS
fuente
3
querías decir .dockerignore? eso me acaba de pasar
Martín Coll
55
¡Salud! Tenía un directorio completo que estaba ignorando que olvidé y rompió mi compilación. Como pequeña nota, puede ignorar un solo archivo en un directorio con: !path/to/my/fileincluso si pathestá en .dockerignore.
hjc1710
Este es bueno.
Gudlaugur Egilsson
No puedo expresar lo agradecido que estoy por esto, me he estado torturando durante todo el día. Todavía no puedo entender por qué VS Tools para docker incluye un .dockerignore con * en él
bilal.haider
No puedo votar lo suficiente!
kmansoor
7

Para mí, el problema era que estaba usando docker build - < Dockerfile

De la documentación Nota: si compila utilizando STDIN ( docker build - < somefile), no hay contexto de compilación, por lo que COPY no se puede utilizar.

Adán
fuente
1

Como ha declarado la respuesta de Xavier Lucas [extremadamente útil], no puede usar COPY o ADD desde un directorio fuera de su contexto de compilación (la carpeta desde la que ejecuta "docker build", debe ser el mismo directorio que su .Dockerfile). Incluso si intentas usar un enlace simbólico, no funcionará.

Nota: Esto es específico para POSIX (Linux, Unix, Mac, Posiblemente Linux Subsystem for Windows). Es posible que pueda hacer algo similar en Windows usando JUNCTION.

cd ~/your_docker_project/
cp -al /subfolder/src_directory ./
echo "COPY src_directory /subfolder/" >> Dockerfile

Peligro: el uso de esto hará que su proyecto acoplable sea específico para el host. ¡Casi nunca quieres hacer esto! Tratar con cuidado.

Aplicación: aprendizaje, experimentación en un entorno de desarrollo

Esto hizo el truco para mí. cp -al copia la estructura del directorio y crea enlaces duros para todos los archivos. Cuando haya terminado, ejecute "rm -rf ./src_directory" para eliminarlo.

TamusJRoyce
fuente
Mi propósito: copiar paquetes en caché en mi sistema de archivos local a mi imagen acoplable. Instale las herramientas que necesito (usará el caché o lo descargará de nuevo). Luego elimino ese caché en la imagen y elimino los enlaces duros en el host. Si el host no tiene esos archivos, no se preocupe. Pero tengo un ancho de banda limitado y un espacio de disco limitado. ¿Es este un uso aceptable?
TamusJRoyce
1

Me encontraba con este problema y descubrí que podía agregar un contexto a la variable de compilación para cargar mis Dockerfile (s) desde otros directorios. Esto me permitió cambiar mi estructura de archivos Docker predeterminada un poco más a mi gusto. Aquí hay un fragmento de mi docker-compose.yml:

version: '3'
services:
  webserver:
    build:
      context: .
      dockerfile: ./server/Dockerfile
    ...

Al agregar el contexto pude definir dónde se debería hacer referencia a los archivos. Puede consultar los documentos de Docker aquí: https://docs.docker.com/compose/compose-file/#context

¡Espero que esto ayude!

Ron
fuente
0

Para mí, el problema era que el nombre de archivo que estaba agregando tenía un espacio final. Un cambio de nombre lo arregló.

Hawkeye
fuente
0

Para el siguiente error,

COPY failed: stat

Lo conseguí reiniciando el servicio de docker.

Vineeth
fuente
0

Finalmente resolví este problema en mi caso, Dockerfile que ejecuta la copia estaba en un nivel más profundo del proyecto. Entonces me di cuenta de que la ruta de compilación del host se expresa en relación con la ubicación del archivo Dockerfile.

EmilianoPe
fuente
0

Esto me sucedió cuando intentaba ejecutar el archivo acoplable desde un directorio diferente.

Tuve el COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directoryy logré resolver esto especificando el archivo acoplable.

Correr docker build . -f docker/development/Dockerfilefuncionó.

Pero ejecutar Runningdocker build docker / development / Dockerfile` causó este problema.

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

Al principio me pareció extraño porque cuando tenía el Dockerfiledirectorio raíz de aplicaciones funcionaba bien. Esto ayudará si desea administrar un poco mejor los archivos acoplables de su entorno.

Una estrella
fuente
0

El archivo no solo debe estar en un directorio en el contexto de compilación actual, sino que el archivo tampoco puede ser un enlace suave a un archivo fuera del contexto de compilación.

Tenía un enlace a un archivo en mi directorio de inicio, y el enlace estaba en el directorio del proyecto. Después de eliminar el enlace y mover el archivo vinculado al proyecto ( rm mylink ; mv ~/myrealfile ./), funcionó.

Loduwijk
fuente