Problème de Docker COPY - "aucun fichier ni répertoire de ce type"

38

Dans mon fichier Dockerfile, j'ai la déclaration 'COPY "suivante:

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

Il va sans dire que dans mon système hôte, sous le répertoire "/ srv / visitor", il y a bien mon code source:

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

Maintenant, quand j'essaie de construire une image en utilisant ce fichier Dockerfile, il se bloque à l'étape où la "COPY" est supposée se produire:

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

Il est dit qu'il n'y a pas de tel répertoire, mais il y en a un.

Des idées?

MISE À JOUR 1:

On m'a fait remarquer que je me suis trompé, dans la façon dont j'ai compris le contexte de construction. La suggestion équivalait à changer la déclaration "COPY" en ceci:

COPY . /srv/visitor

Le problème est que je l'ai eu de cette façon, et le processus de construction s'est arrêté à l'étape suivante:

RUN npm install

Il dit quelque chose du genre "pas de fichier package.json trouvé", quand il y en a un.

MISE À JOUR 2:

J'ai essayé de l'exécuter avec ce changement dans le fichier Dockerfile:

COPY source /srv/visitor/

Il s’est arrêté en essayant de lancer 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

Alors, la copie a-t-elle été réalisée? Si oui, pourquoi npm est-il incapable de trouver package.json?

Dsljanus
la source
Pour ceux qui recherchent un problème en 2017 - ceci peut être votre problème github.com/docker/for-mac/issues/1922 . il vous recommande de supprimer votre fichier .dockerignore et de refaire le test. Si cela fonctionne, vous pouvez modifier vos paramètres dans .dockerignore pour résoudre le problème.
Undefined

Réponses:

36

De la documentation:

Le <src>chemin doit être dans le contexte de la construction ; vous ne pouvez pas copier ../quelque chose / quelque chose, car la première étape d'une construction de menu fixe consiste à envoyer le répertoire de contexte (et les sous-répertoires) au démon de menu fixe.

Lorsque vous utilisez, /srv/visitorvous utilisez un chemin absolu en dehors du contexte de construction, même s'il s'agit en fait du répertoire en cours.

Vous feriez mieux d'organiser votre contexte de construction de la manière suivante:

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

Et utilise :

COPY resources /srv/visitor/

Remarque:

docker build - < Dockerfile n'a pas de contexte.

D'où utilisation,

docker build .

Xavier Lucas
la source
Je suis déjà dans le répertoire "/ srv / visitor" de mon système hôte et tout mon code source, ainsi que le fichier Docker, est ici. Comment dois-je écrire mon instruction "COPY" afin que toute cette source soit copiée dans le répertoire "/ srv / visitor" du conteneur?
dsljanus
1
@dsljanus Le répertoire ou le fichier source doit être relatif au contexte de construction, c'est-à-dire au /srv/visitorrépertoire.
Xavier Lucas
Alors, devrait-il être "."? Parce que je l'avais ainsi, et le processus de construction s'est arrêté à l'étape suivante, "RUN npm install". Il a dit quelque chose dans les lignes de "pas de fichier package.json trouvé". S'il vous plaît voir ma mise à jour aussi.
dsljanus
2
@dsljanus Et alors, d'où partez-vous NPM? Publiez l'intégralité de votre fichier docker ... En fait, ne modifiez pas plusieurs mises à jour de ce type dans les questions, c'est vraiment ennuyant de passer d'un problème à un autre. L'objectif de SF est de poser des questions claires afin d'obtenir des réponses claires.
Xavier Lucas
1
@dsljanus Ok, voilà donc le problème, n'utilisez pas, RUN cdmais utilisez WORKDIRafin que le répertoire actuel soit mémorisé entre chaque étape. Un fichier docker n'est pas plus qu'un wrapper pour le docker run + docker, donc chaque étape est exécutée indépendamment du calque précédent. Cela signifie que pwd est égal /à chaque étape si vous n'utilisez pas cette directive.
Xavier Lucas
41

Pour moi, le répertoire était dans le bon contexte, seul il était inclus dans le .dockerignorefichier (caché) à la racine du projet. Cela conduit au message d'erreur suivant:

lstat mydir/myfile.ext: no such file or directory
AlcaDotS
la source
3
tu voulais dire .dockerignore? cela m'est juste arrivé
Martín Coll
5
Soyez bénis! J'ignorais un répertoire entier que j'oubliais et qui cassait ma construction. En guise de petite remarque, vous pouvez supprimer un seul fichier dans un répertoire avec: !path/to/my/filemême si pathest dans .dockerignore.
hjc1710
C'est une bonne.
Gudlaugur Egilsson
Je ne peux pas exprimer à quel point je suis reconnaissant envers vous pour cela, je me suis torturé pendant toute la journée. Je ne comprends toujours pas pourquoi VS Tools for docker inclut un .dockerignore avec *
bilal.haider
Je ne peux pas voter assez!
kmansoor
7

Pour moi, le problème était que j'utilisais docker build - < Dockerfile

De la documentation Remarque: Si vous construisez à l'aide de STDIN ( docker build - < somefile), il n'y a pas de contexte de construction et COPY ne peut donc pas être utilisé.

Adam
la source
1

Comme Xavier Lucas [extrêmement utile] a répondu, vous ne pouvez pas utiliser COPY ou ADD à partir d'un répertoire situé en dehors de votre contexte de construction (le dossier à partir duquel vous exécutez "docker build" doit être le même répertoire que votre fichier .Docker). Même si vous essayez d'utiliser un lien symbolique, cela ne fonctionnera pas.

Remarque: Ceci est spécifique à POSIX (Linux, Unix, Mac, éventuellement sous-système Linux pour Windows). Vous pourrez peut-être faire la même chose dans Windows en utilisant JUNCTION.

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

Danger: Utiliser ceci rendra votre projet de menu fixe spécifique à l'hôte. Vous ne voulez presque jamais faire ça! Manipuler avec soin.

Application: apprendre, expérimenter dans un environnement de développement

Cela a fait le tour pour moi. cp -al copie la structure de répertoires et crée des liens en dur pour tous les fichiers. Lorsque vous avez terminé, exécutez "rm -rf ./src_directory" pour le supprimer.

TamusJRoyce
la source
Mon objectif: copier les packages mis en cache sur mon système de fichiers local vers mon image de menu fixe. Installez les outils dont j'ai besoin (il utilisera le cache ou le téléchargera à nouveau). Ensuite, je supprime ce cache dans l'image et supprime les liens physiques sur l'hôte. Si l'hôte n'a pas ces fichiers, pas de souci. Mais j'ai une bande passante limitée et un espace disque limité. Est-ce une utilisation acceptable?
TamusJRoyce
1

Je rencontrais ce problème et découvris que je pouvais ajouter un contexte à la variable de construction afin de charger mon (mes) fichier (s) Docker à partir d'autres répertoires. Cela m'a permis de modifier un peu plus la structure de mon fichier Docker par défaut. Voici un extrait de mon fichier docker-compose.yml:

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

En ajoutant le contexte, j'ai pu définir où les fichiers devaient être référencés. Vous pouvez référencer les documents Docker ici: https://docs.docker.com/compose/compose-file/#context

J'espère que cela t'aides!

Ron
la source
0

Pour moi, le problème était que le nom de fichier que j’ ajoutais avait un espace de fin. Un changement de nom l'a corrigé.

Oeil de faucon
la source
0

Pour l'erreur suivante,

COPY failed: stat

Je l'ai eu en redémarrant le service Docker.

Vineeth
la source
0

J'ai finalement résolu ce problème dans mon cas si Dockerfile qui exécute la copie était à un niveau plus profond du projet. J'ai donc réalisé que le chemin de génération de l'hôte est exprimé par rapport à l'emplacement du fichier Dockerfile.

EmilianoPe
la source
0

Cela m'est arrivé lorsque j'ai essayé d'exécuter le fichier docker à partir d'un répertoire différent.

J'ai eu COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directoryet réussi à résoudre ce problème en spécifiant le fichier docker.

Courir a docker build . -f docker/development/Dockerfilefonctionné.

Mais en cours d' exécution Runningbuild docker docker / développement / Dockerfile` a causé ce problème.

-fou --filepour spécifier le nom et l'emplacement du fichier Dockerfile.

Cela a paru étrange au début parce que, lorsque j’avais le Dockerfilerépertoire racine des applications, cela fonctionnait bien. Cela vous aidera si vous souhaitez gérer un peu mieux les fichiers de votre environnement de travail.

Une étoile
la source
0

Non seulement le fichier doit se trouver dans un répertoire du contexte de construction actuel, mais il ne peut pas non plus être un lien symbolique vers un fichier situé en dehors du contexte de construction.

J'avais un lien vers un fichier dans mon répertoire personnel et le lien se trouvait dans le répertoire du projet. Après avoir supprimé le lien et déplacé le fichier lié dans le projet ( rm mylink ; mv ~/myrealfile ./), cela a fonctionné.

Loduwijk
la source