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?
Respuestas:
De la documentación:
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:
Y use :
Nota:
docker build - < Dockerfile
No tiene ningún contexto.De ahí el uso,
docker build .
fuente
/srv/visitor
directorio.RUN cd
pero useWORKDIR
para 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.Para mí, el directorio estaba en el contexto correcto, solo que estaba incluido en el
.dockerignore
archivo (oculto) en la raíz del proyecto. Esto lleva al mensaje de error:fuente
.dockerignore
? eso me acaba de pasar!path/to/my/file
incluso sipath
está en.dockerignore
.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.fuente
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á.
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.
fuente
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:
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!
fuente
Para mí, el problema era que el nombre de archivo que estaba agregando tenía un espacio final. Un cambio de nombre lo arregló.
fuente
Para el siguiente error,
Lo conseguí reiniciando el servicio de docker.
fuente
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.
fuente
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 directory
y logré resolver esto especificando el archivo acoplable.Correr
docker build . -f docker/development/Dockerfile
funcionó.Pero ejecutar
Running
docker build docker / development / Dockerfile` causó este problema.-f
o--file
para especificar el nombre y la ubicación deDockerfile
.Al principio me pareció extraño porque cuando tenía el
Dockerfile
directorio raíz de aplicaciones funcionaba bien. Esto ayudará si desea administrar un poco mejor los archivos acoplables de su entorno.fuente
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ó.fuente
Para mí fue un problema con el SDK de Google Cloud:
https://code.google.com/p/google-cloud-sdk/issues/detail?id=1431
fuente