Eu tenho um Dockerfile configurado na minha pasta raiz (~). As três primeiras linhas do meu arquivo são assim:
COPY file1 /root/folder/
COPY file2 /root/folder/
COPY file3 /root/folder/
mas retorna o seguinte erro para cada linha:
Não existe tal arquivo ou diretório
Os arquivos estão no mesmo diretório que meu Dockerfile e estou executando o comando docker build - < Dockerfile
no mesmo diretório no terminal também.
O que estou fazendo de errado aqui exatamente?
Respostas:
A instrução COPY em
Dockerfile
copia os arquivossrc
para adest
pasta. Parece que estão ausentes afile1
,file2
efile3
ou tentando construir aDockerfile
partir da pasta errada.Consulte Documento Dockerfile
Além disso, o comando para construir o
Dockerfile
deve ser algo como.fonte
Verifique o
.dockerignore
arquivo também.Eu sei que este é um caso muito raro, mas eu tinha aquele arquivo mencionado lá.
fonte
ripgrep
não procuro em dotfiles, então não vi a última referência incômoda ao diretório antigo.É possível que seja causado por você estar se referindo a file1 / file2 / file3 como um caminho absoluto que não está no contexto de construção, o Docker apenas pesquisa o caminho no contexto de construção.
Por exemplo, se você usar COPY / home / seunome / arquivo1, o Docker build o interpretará como $ {docker build working directory} / home / yourname / file1, se nenhum arquivo com o mesmo nome aqui, nenhum arquivo ou erro de diretório será gerado.
Consulte Um dos problemas do docker
fonte
ADD
diretiva também, obrigado.Parece que os comandos:
e:
não são executados da mesma maneira. Se você deseja construir 2 imagens do docker de dentro de uma pasta com Dockerfile e Dockerfile2, o comando COPY não pode ser usado no segundo exemplo usando stdin (<Dockerfile2). Em vez disso, você deve usar:
Então o COPY funciona conforme o esperado.
fonte
Executando
docker build . -f docker/development/Dockerfile
funcionou, o que permite que você execute o arquivo docker a partir de um diretório especificado diferente da raiz do seu aplicativo.Use
-f
ou--file
para especificar o nome e a localização doDockerfile
.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.Foi
docker build docker/development/Dockerfile
isso que causou esse problema para mim.Achei estranho no começo porque quando eu tinha o
Dockerfile
no diretório raiz do apps funcionava bem. Isso ajudará se você quiser gerenciar um pouco melhor os arquivos do docker do ambiente.fonte
docker build . -f docker/development/Dockerfile
isso funcionaAcabei de ter esse problema e nenhuma das sugestões aqui resolveu meu problema. Acontece que eu tinha as terminações de linha erradas em meu arquivo e tive que alterá-las para as terminações de linha apropriadas. (Neste caso, de CRLF para LF, para que o Ubuntu 14.04 reconheça o script, que eu estava editando no Windows.)
Eu mudei as terminações de linha usando VSCode, e a maioria dos editores de código deve ter a opção de escolher terminações de linha.
Espero que isso ajude alguém.
fonte
Eu me sinto um pouco estúpido, mas meu problema era que eu estava executando docker-compose e meu Dockerfile estava em um subdiretório ./deploy. Minha referência ADD precisava ser relativa à raiz do projeto, não ao Dockerfile.
Alterado: ADD ./file.tar.gz / etc / folder / para: ADD ./deploy/file.tar.gz / etc / folder /
De qualquer forma, pensei em postar no caso de alguém ter o mesmo problema.
fonte
Aqui está a solução e a prática recomendada:
Você precisa criar uma pasta de recursos onde possa manter todos os arquivos que deseja copiar.
O comando para copiar arquivos deve ser especificado desta forma:
Onde
* resources - sua pasta local que você criou na mesma pasta onde o Dockerfile está
* / root / folder / - pasta em seu contêiner
fonte
Eu sei que isso é antigo, mas algo a destacar. Se você acha que tudo está como deveria, verifique seu arquivo .gitignore :)
Você pode ter a pasta localmente, mas se a pasta estiver em seu git ignore, ela não está no servidor, o que significa que o Docker não pode encontrar essa pasta porque ela não existe.
fonte
Para o seguinte erro,
Eu resolvi reiniciando o serviço docker.
fonte
Erro de arquivo não encontrado com Docker put_archive. Estou usando a API Python para docker. Docker versão 1.12.5, compilação 7392c3b
Não consigo copiar arquivos para um contêiner docker criado.
Se eu alterar a ordem de operação, não há erro e os arquivos são copiados exatamente para onde eu os desejo. Portanto, sei que meu código está funcionando e fazendo o que eu quero fazer. Mas é importante copiar os arquivos de configuração para um contêiner antes de ser iniciado. Copiar os arquivos após o início faz com que o contêiner comece com uma configuração padrão e não com a configuração personalizada que precisa ser copiada para o local antes de o contêiner ser iniciado. Docker afirma que esse problema foi encerrado, mas ainda está afetando meu aplicativo.
Isso funciona; Ordem de execução diferente do mesmo código.
fonte
se você tiver certeza de que fez a coisa certa, mas o docker ainda reclama, dê uma olhada neste problema: https://github.com/moby/moby/issues/27134 .
Fiquei queimado com isso, e parece que reiniciar o motor do docker
service docker restart
só vai resolver o problema.fonte
Eu estava procurando uma solução para isso e a pasta que estava ADICIONANDO ou COPIANDO não estava na pasta de compilação, vários diretórios acima ou referenciados em /
Mover a pasta de fora da pasta de compilação para a pasta de compilação corrigiu meu problema.
fonte
uma das maneiras de não usar stdin e manter o contexto é:
1) em seu Dockerfile, você deve adicionar
2) depois, você deve ir no diretório pai / your_dir_to_copy
2) em seguida, execute este comando
3) depois de criar seu contêiner
4) Depois, você terá seu diretório copiado em seu contêiner
fonte
As chamadas anteriores no COPY podem estar alterando o diretório.
Adicione uma barra final à primeira chamada
fonte
Eu corri para isso. Copiar alguns diretórios não funcionou. Copiar arquivos sim. Acontece que os arquivos contidos em .gitignore (não apenas .dockerignore) também são ignorados. Veja: https://github.com/zeit/now/issues/790
fonte
.dockerignore
como culpadaSemelhante e graças à resposta de tslegaitis , após
isto mostra
Verificando esse log, ele diz que o docker usará
.gitignore
:Então, eu consertei meu
.gitignore
(uso-o como lista de permissões) e o docker copiei o arquivo.[Eu adicionei a resposta porque não tenho reputação suficiente para comentar]
fonte
Tive esse problema, embora meu diretório de origem estivesse no contexto de compilação correto. O motivo foi que meu diretório de origem era um link simbólico para um local fora do contexto de construção.
Por exemplo, meu Dockerfile contém o seguinte:
Se
dir1
for um link simbólico oCOPY
comando não está funcionando no meu caso.fonte
Então, isso aconteceu algumas vezes recentemente. Como um .Net dev, usando VisualStudio mudei meu nome de compilação de
SomeThing
paraSomething
como o nome de DLL, mas isso não altera o arquivo .csproj que permaneceSomeThing.csproj
O Dockerfile usa nomes de arquivo que diferenciam maiúsculas de minúsculas do Linux, de modo que o Dockerfile recém-gerado automaticamente estava tentando copiar
Something.csproj
e não conseguiu encontrar. Portanto, renomear manualmente esse arquivo (tornando-o minúsculo) fez com que tudo funcionasseMas ... aqui está um aviso preventivo. Esta mudança de nome de arquivo no meu laptop Windows não é detectada pelo Git, então a fonte do repo ainda estava
SomeThing.csproj
no repo e durante o processo de CI / CD, a compilação do Docker falhou pelos mesmos motivos ...Tive que alterar o nome do arquivo diretamente como um commit no repo ... uma pequena solução desagradável, mas me ajudou a continuar
tl; dr Se no Windows O / S, verifique a distinção entre maiúsculas e minúsculas no nome do arquivo e esteja ciente de que renomeações de arquivos locais não são selecionadas conforme o Git muda, então certifique-se de que seu repo também seja modificado se usar CI / CD
fonte
Algumas ótimas respostas já estão aqui. O que funcionou para mim foi mover os comentários para a próxima linha.
RUIM :
BOM :
fonte