Docker COPY issue - “nenhum tal arquivo ou diretório”

35

No meu Dockerfile, tenho a seguinte instrução 'COPY':

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

Não é preciso dizer que no meu sistema host, sob o diretório "/ srv / visitor", existe de fato meu código-fonte:

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

Agora, quando tento criar uma imagem usando este Dockerfile, ela fica paralisada na etapa em que a "COPY" deve acontecer:

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

Diz que não existe tal diretório, mas claramente existe.

Alguma idéia?

UPDATE 1:

Tem sido apontado para mim que eu estava enganado, da maneira como entendi o contexto de construção. A sugestão equivalia a mudar a declaração "COPY" para esta:

COPY . /srv/visitor

O problema é que eu tive dessa maneira, e o processo de construção parou na próxima etapa:

RUN npm install

Ele disse algo do tipo "nenhum arquivo package.json encontrado", quando claramente existe um.

UPDATE 2:

Eu tentei executá-lo com essa alteração no Dockerfile:

COPY source /srv/visitor/

Ele parou ao tentar executar o 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

Então, a cópia foi executada? Se sim, por que o npm não consegue encontrar o package.json?

    
por dsljanus 09.02.2015 / 14:48

10 respostas

33

Da documentação:

The <src> path must be inside the context of the build; you cannot COPY ../something /something, because the first step of a docker build is to send the context directory (and subdirectories) to the docker daemon.

Quando você usa /srv/visitor , está usando um caminho absoluto fora do contexto de construção, mesmo que seja o diretório atual.

É melhor organizar seu contexto de criação da seguinte forma:

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

E use:

COPY resources /srv/visitor/
    
por 09.02.2015 / 14:57
37

Para mim, o diretório estava no contexto correto, apenas ele foi incluído no arquivo (oculto) .dockerignore na raiz do projeto. Isso leva à mensagem de erro:

lstat mydir/myfile.ext: no such file or directory
    
por 10.05.2016 / 17:11
6

Para mim, o problema é que eu estava usando docker build - < Dockerfile

A partir da documentação Nota: Se você criar usando STDIN ( docker build - < somefile ), não haverá contexto de construção, portanto, COPY não pode ser usado.

    
por 15.12.2016 / 03:36
1

Como Xavier Lucas [extremamente útil] respondeu, você não pode usar COPY ou ADD de um diretório fora de seu contexto de construção (a pasta que você executa "docker build", deve ser o mesmo diretório que seu .Dockerfile). Mesmo se você tentar usar um link simbólico, não funcionará.

Note: This is specific to POSIX (Linux, Unix, Mac, Possibly Linux Subsystem for Windows). You may be able to do similar in Windows using JUNCTION.

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

Danger: Using this will make your docker project specific to the host. You almost never want to do this! Handle with care.

Application: Learning, Experimenting in a Development Environment

Isso fez o truque para mim. cp -al copia a estrutura do diretório e cria links físicos para todos os arquivos. Quando terminar, execute "rm -rf ./src_directory" para removê-lo.

    
por 20.03.2018 / 18:17
1

Eu estava correndo para este problema e descobri que eu era capaz de adicionar um contexto para a variável de construção, a fim de carregar o meu Dockerfile (s) de outros diretórios. Isso me permitiu alterar um pouco mais a minha estrutura padrão de arquivos do Docker para o meu gosto. Aqui está um trecho do meu docker-compose.yml:

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

Ao adicionar o contexto, consegui definir onde os arquivos devem ser referenciados. Você pode consultar os documentos do Docker aqui: link

Espero que isso ajude!

    
por 27.07.2018 / 20:44
0

Para mim, o problema era que o nome do arquivo que eu estava adicionando tinha um espaço à direita. Uma renomeação consertou isso.

    
por 23.10.2016 / 05:28
0

Para o seguinte erro,

COPY failed: stat

Eu consegui reiniciar o serviço docker.

    
por 12.07.2017 / 09:03
0

Eu finalmente resolvi esse problema no meu caso, o Dockerfile que executa a cópia estava em um nível mais profundo do projeto. Então percebi que o caminho de construção do host é expresso em relação ao local do arquivo do Dockerfile.

    
por 24.08.2017 / 15:22
0

Isso aconteceu comigo ao tentar executar o arquivo docker de um diretório diferente.

Eu tinha o COPY failed: stat /var/lib/docker/tmp/docker-builder929708051/XXXX: no such file or directory e consegui resolver isso especificando o arquivo do docker.

Executando docker build . -f docker/development/Dockerfile trabalhado.

Mas a execução de Running docker build docker / development / Dockerfile 'causou esse problema.

-f ou --file para especificar o nome e a localização do Dockerfile .

Achei estranho no começo porque quando eu tinha o Dockerfile no diretório raiz de aplicativos funcionou bem. Isso ajudará se você quiser gerenciar seus arquivos do Docker de ambiente um pouco melhor.

    
por 11.11.2017 / 18:31
-1

Para mim, foi um problema com o Google Cloud SDK:

link

    
por 03.01.2017 / 16:16