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

En mi Dockerfile tengo la siguiente instrucción ' COPIAR:

# Copy app codeCOPY /srv/visitor /srv/visitor

No hace falta decir que en mi sistema host, en el directorio "/ srv / visitor", está de hecho 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 en el que se supone que debe ocurrir la " COPIA:

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

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

Alguna idea?

ACTUALIZACIÓN 1:

Se me ha señalado que estaba equivocado, en la forma en que entendía el contexto. La sugerencia equivalía a cambiar la declaración "COPIAR" a esta:

COPY . /srv/visitor

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

RUN npm install

Decía algo como "sin paquete.archivo json encontrado", 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 ae5e2a993e11npm ERR! install Couldn't read dependenciesnpm ERR! Linux 3.18.5-1-ARCHnpm ERR! argv "/usr/bin/node" "/usr/sbin/npm" "install"npm ERR! node v0.10.36npm ERR! npm  v2.5.0npm ERR! path /package.jsonnpm ERR! code ENOPACKAGEJSONnpm ERR! errno 34npm 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.logINFO[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 el paquete.json?

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

lstat mydir/myfile.ext: no such file or directory

De la documentación :

El <src> camino debe estar dentro del contexto de la compilación; no se puede copiar ../ something / something, porque el primer paso de una compilación de docker es enviar el directorio de contexto (y los subdirectorios) al demonio de docker.

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

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

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

Y uso :

COPY resources /srv/visitor/

Nota:

docker build - < Dockerfile no tiene contexto.

De ahí el uso,

docker build .

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

Desde el documentaciónNota: Si construyes usando STDIN (docker build - < somefile), no hay contexto de compilación, por lo que no se puede usar COPY.

Me encontré con este problema y descubrí que podía agregar un contexto a la variable de compilación para cargar mis archivos Docker 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 debe hacer referencia a los archivos. Puede hacer referencia a los documentos de Docker aquí: https://docs.docker.com/compose/compose-file/#context

Espero que esto ayude!

Como ha dicho la respuesta de Xavier Lucas [extremadamente útil], no puede usar COPIAR o AGREGAR 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 intenta utilizar un enlace simbólico, no funcionará.

Nota: Esto es específico de POSIX (Linux, Unix, Mac, Posiblemente Subsistema Linux para Windows). Es posible que pueda hacer algo similar en Windows con 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 de docker sea específico para el host. ¡Casi nunca quieres hacer esto! Manipule con cuidado.

Aplicación: Aprendizaje, Experimentación en un Entorno de Desarrollo

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

Para el siguiente error,

COPY failed: stat

Lo solucioné reiniciando el servicio Docker.

Esto me sucedió al intentar ejecutar el archivo docker desde un directorio diferente.

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

Ejecutar docker build . -f docker/development/Dockerfile trabajar.

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

-f o --file para especificar el nombre y la ubicación de la Dockerfile.

Al principio me pareció extraño porque cuando tuve la Dockerfile en el directorio raíz de aplicaciones funcionó bien. Esto le ayudará si desea administrar un poco mejor los archivos de Docker de su entorno.

Para cualquier persona que esté interesada,.gitignore también puede causar el problema. En mi caso, hilo.lock fue ignorado. Y arrojó un error similar.

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

Finalmente resolví este problema en mi caso fue Dockerfile que ejecuta copy estaba en un nivel más profundo del project.So Me di cuenta de que la ruta de compilación del host se expresa en relación con la ubicación del archivo Dockerfile.

Para aquellos que buscan un problema en 2017 , este puede ser su problema /var/lib/docker/tmp/docker-builderXXXXXXX/... no such file or directory · Issue #1922 · docker/for-mac · GitHub. recomienda eliminarte .dockerignore el archivo y vuelva a realizar la prueba. Si eso funciona, puedes jugar con tu configuración.dockerignore para resolver el problema.