No meu Dockerfile eu tenho a seguinte declaração 'COPY':
# Copy app code
COPY /srv/visitor /srv/visitor
Não é preciso dizer que no meu sistema host, no 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 construir uma imagem usando este Dockerfile, ela trava na etapa em que o "COPY" deveria acontecer:
Step 10 : COPY /srv/visitor /srv/visitor
INFO[0155] srv/visitor: no such file or directory
Ele diz que não existe tal diretório, mas claramente existe.
Alguma ideia?
ATUALIZAÇÃO 1:
Já me foi apontado que eu estava enganado, na forma como entendi construir contexto. A sugestão consistia em alterar a instrução "COPY" para isso:
COPY . /srv/visitor
O problema é que eu tinha dessa maneira, e o processo de compilação parou na próxima etapa:
RUN npm install
Ele disse algo como "nenhum arquivo package.json encontrado", quando claramente existe um.
ATUALIZAÇÃO 2:
Eu tentei executá-lo com esta 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 realizada? Se sim, por que o npm não consegue encontrar o package.json?
Para mim o diretório estava no contexto correto, apenas foi incluído no
.dockerignore
arquivo (oculto) na raiz do projeto. Isso leva à mensagem de erro:Da documentação:
Quando você usa
/srv/visitor
, está usando um caminho absoluto fora do contexto de compilação, mesmo que seja realmente o diretório atual.É melhor você organizar seu contexto de compilação assim:
E use :
Observação:
docker build - < Dockerfile
não tem contexto.Daí o uso,
docker build .
Para mim, o problema era que eu estava usando
docker build - < Dockerfile
Da documentação Nota: Se você compilar usando STDIN (
docker build - < somefile
), não há contexto de compilação, então COPY não pode ser usado.Eu estava enfrentando esse problema e descobri que consegui adicionar um contexto à variável de compilação para carregar meu(s) Dockerfile(s) de outros diretórios. Isso me permitiu alterar minha estrutura de arquivos padrão do Docker um pouco mais ao meu gosto. Aqui está um trecho do meu docker-compose.yml:
Ao adicionar o contexto, consegui definir onde os arquivos deveriam ser referenciados. Você pode fazer referência aos documentos do Docker aqui: https://docs.docker.com/compose/compose-file/#context
Espero que isto ajude!
Como a resposta de Xavier Lucas [extremamente útil] afirmou, você não pode usar COPY ou ADD de um diretório fora do seu contexto de compilação (a pasta da qual 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á.
Isso fez o truque para mim. cp -al copia a estrutura de diretórios e cria links físicos para todos os arquivos. Quando terminar, execute "rm -rf ./src_directory" para removê-lo.
Para o seguinte erro,
Eu consegui reiniciando o serviço docker.
Para mim, o problema era que o nome do arquivo que eu estava adicionando tinha um espaço à direita. Uma renomeação corrigiu.
Eu finalmente resolvi esse problema no meu caso era 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.
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 docker.Correr
docker build . -f docker/development/Dockerfile
funcionou.Mas a execução
Running
do docker build docker/development/Dockerfile` causou esse problema.-f
ou--file
para especificar o nome e o local do arquivoDockerfile
.Achei estranho no começo porque quando eu tinha o
Dockerfile
diretório raiz dos aplicativos funcionou bem. Isso ajudará se você quiser gerenciar um pouco melhor os arquivos docker de ambiente.Não apenas o arquivo deve estar em um diretório no contexto de compilação atual, mas o arquivo também não pode ser um soft link para um arquivo fora do contexto de compilação.
Eu tinha um link para um arquivo no meu diretório pessoal e o link estava no diretório do projeto. Depois de excluir o link e mover o arquivo vinculado para o projeto (
rm mylink ; mv ~/myrealfile ./
), funcionou.