Problema COPY Docker: "nessun file o directory"


38

Nel mio Dockerfile ho la seguente dichiarazione "COPIA":

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

Va da sé che nel mio sistema host, sotto la directory "/ srv / visitor", c'è davvero il mio codice sorgente:

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

Ora, quando provo a creare un'immagine usando questo Dockerfile, si blocca nel passaggio in cui si suppone che accada "COPIA":

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

Dice che non esiste una tale directory, ma chiaramente esiste.

Qualche idea?

AGGIORNAMENTO 1:

Mi è stato indicato che mi sono sbagliato, nel modo in cui ho capito il contesto di costruzione. Il suggerimento ha comportato la modifica dell'istruzione "COPIA" in questo modo:

COPY . /srv/visitor

Il problema è che l'ho fatto in questo modo e il processo di generazione si è interrotto al passaggio successivo:

RUN npm install

Diceva qualcosa sulla falsariga di "nessun file package.json trovato", quando chiaramente ce n'è uno.

AGGIORNAMENTO 2:

Ho provato a eseguirlo con questa modifica nel Dockerfile:

COPY source /srv/visitor/

Si è arrestato durante il tentativo di eseguire 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

Quindi, la copia è stata eseguita? Se sì, perché npm non è in grado di trovare package.json?


Per chi è alla ricerca di un problema nel 2017, potrebbe trattarsi del problema github.com/docker/for-mac/issues/1922 . consiglia di eliminare il file .dockerignore e ripetere il test. Se funziona, puoi manipolare le tue impostazioni in .dockerignore per risolvere il problema.
Non definito

Risposte:


36

Dalla documentazione:

Il <src>percorso deve essere all'interno del contesto della build ; non puoi COPIARE .. / qualcosa / qualcosa, perché il primo passo di una build docker è inviare la directory di contesto (e le sottodirectory) al demone docker.

Quando si utilizza /srv/visitorsi utilizza un percorso assoluto al di fuori del contesto di compilazione anche se in realtà è la directory corrente.

È meglio organizzare il contesto di compilazione in questo modo:

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

E usa:

COPY resources /srv/visitor/

Nota:

docker build - < Dockerfile non ha alcun contesto.

Quindi uso,

docker build .


Sono già nella directory "/ srv / visitor" del mio sistema host e tutto il mio codice sorgente, oltre al Dockerfile, è qui. Come devo scrivere la mia dichiarazione "COPY" in modo che tutta questa fonte venga copiata nella directory "/ srv / visitor" del contenitore?
dsljanus,

1
@dsljanus La directory o il file di origine deve essere relativo al contesto di compilazione, ovvero alla /srv/visitordirectory.
Xavier Lucas,

Quindi, dovrebbe essere "."? Perché l'ho fatto in quel modo e il processo di compilazione si è fermato al passaggio successivo, "RUN npm install". Ha detto qualcosa sulla falsariga di "nessun file package.json trovato". Vedi anche il mio aggiornamento.
dsljanus,

2
@dsljanus E allora da dove corri npm? Pubblica il tuo intero dockerfile ... A proposito, non modificare più aggiornamenti come questo nelle domande, è davvero fastidioso passare da un problema a uno completamente diverso. Lo scopo di SF è di pubblicare domande chiare al fine di ottenere risposte chiare.
Xavier Lucas,

1
@dsljanus Ok, questo è il problema, non usarlo RUN cdma usalo per WORKDIRricordare la directory corrente tra ogni passaggio. Un file docker non è altro che un wrapper per l'esecuzione docker + commit docker, quindi ogni passaggio viene eseguito in modo indipendente rispetto al livello precedente. Ciò significa che pwd è uguale /in ogni passaggio se non si utilizza questa direttiva.
Xavier Lucas,

41

Per me la directory era nel contesto corretto, solo era inclusa nel .dockerignorefile (nascosto) nella radice del progetto. Questo porta al messaggio di errore:

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

3
intendevi .dockerignore? mi è appena successo
Martín Coll,

5
Salute! Avevo un'intera directory che stavo ignorando di cui mi ero dimenticato e ha rotto la mia build. Come piccola nota, puoi annullare l'ignoramento di un singolo file in una directory con: !path/to/my/fileanche se pathè presente .dockerignore.
hjc1710,

Questo è buono.
Gudlaugur Egilsson,

Non posso esprimere la mia gratitudine per questo, mi sono torturato per tutto il giorno passato. Non riesco ancora a capire perché VS Tools per docker include un .dockerignore con * al suo interno
bilal.haider

Non puoi votarlo abbastanza!
kmansoor

7

Per me il problema era che stavo usando docker build - < Dockerfile

Dalla documentazione Nota: se si crea utilizzando STDIN ( docker build - < somefile), non esiste un contesto di compilazione, quindi COPY non può essere utilizzato.


1

Come ha affermato la risposta [estremamente utile] di Xavier Lucas, non è possibile utilizzare COPY o ADD da una directory esterna al contesto di compilazione (la cartella da cui si esegue "docker build" deve essere la stessa directory del file .Docker). Anche se si tenta di utilizzare un collegamento simbolico, non funzionerà.

Nota: questo è specifico per POSIX (Linux, Unix, Mac, eventualmente sottosistema Linux per Windows). Potresti essere in grado di fare simili in Windows usando JUNCTION.

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

Pericolo: l'utilizzo di questo renderà il progetto docker specifico per l'host. Non vuoi quasi mai farlo! Maneggiare con cura.

Applicazione: apprendimento, sperimentazione in un ambiente di sviluppo

Questo ha fatto il trucco per me. cp -al copia la struttura della directory e crea collegamenti reali per tutti i file. Al termine, eseguire "rm -rf ./src_directory" per rimuoverlo.


Il mio scopo: copiare i pacchetti memorizzati nella cache sul mio filesystem locale nell'immagine docker. Installa gli strumenti di cui ho bisogno (utilizzerà la cache o la scaricherà nuova). Quindi cancello quella cache nell'immagine ed elimino i collegamenti reali sull'host. Se l'host non ha quei file, non preoccuparti. Ma ho larghezza di banda limitata e spazio su disco limitato. È un uso accettabile?
TamusJRoyce,

1

Stavo riscontrando questo problema e ho scoperto che ero in grado di aggiungere un contesto alla variabile build per caricare i miei file Docker da altre directory. Ciò mi ha permesso di modificare la struttura dei file Docker predefinita un po 'di più per i miei gusti. Ecco un frammento del mio docker-compose.yml:

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

Aggiungendo il contesto sono stato in grado di definire dove fare riferimento ai file. Puoi fare riferimento ai documenti Docker qui: https://docs.docker.com/compose/compose-file/#context

Spero che sia di aiuto!


0

Per me il problema era che il nome file che stavo aggiungendo aveva uno spazio finale. Una ridenominazione l'ha risolto.


0

Per il seguente errore,

COPY failed: stat

Ho risolto il problema riavviando il servizio docker.


0

Ho finalmente risolto questo problema nel mio caso era Dockerfile che esegue la copia era a un livello più profondo del progetto. Quindi mi sono reso conto che il percorso di compilazione dell'host è espresso in relazione alla posizione del file Dockerfile.


0

Questo mi è successo durante il tentativo di eseguire il file docker da una directory diversa.

Ho avuto COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directorye sono riuscito a risolverlo specificando il file docker.

La corsa ha docker build . -f docker/development/Dockerfilefunzionato.

Ma eseguire Runningdocker build docker / development / Dockerfile` ha causato questo problema.

-fo --fileper specificare il nome e la posizione di Dockerfile.

All'inizio è stato strano perché quando avevo il Dockerfilenella directory root delle app funzionava bene. Ciò sarà utile se si desidera gestire un po 'meglio i file della finestra mobile dell'ambiente.


0

Non solo il file deve trovarsi in una directory nel contesto di compilazione corrente, ma non può nemmeno essere un collegamento software a un file esterno al contesto di compilazione.

Avevo un collegamento a un file nella mia directory home e il collegamento era nella directory del progetto. Dopo aver eliminato il collegamento e spostato il file collegato nel progetto ( rm mylink ; mv ~/myrealfile ./), ha funzionato.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.