Criei alguns diretórios diferentes na minha máquina host enquanto tento aprender sobre o Docker apenas para manter meus arquivos docker organizados. Meu Dockerfile que acabei de executar fica assim:
FROM crystal/centos
MAINTAINER crystal
ADD ./rpms/test.rpm ./rpms/
RUN yum -y --nogpgcheck localinstall /rpms/test.rpm
Minha rpm real é de apenas 1 GB. Mas quando tento fazer sudo docker build -t="crystal/test" .
, recebo o contexto de construção para o daemon Docker de 3,5 GB. Existe alguma outra coisa que eu desconheço enquanto você continua criando imagens do Docker? Minha memória está se acumulando à medida que construo mais imagens em meus outros diretórios na minha máquina host?
.dockerignore
Respostas:
O cliente do Docker envia todo o "contexto de construção" para o daemon do Docker. Esse contexto de construção (por padrão) é o diretório inteiro
Dockerfile
em que está (portanto, arpms
árvore inteira ).Você pode configurar um
.dockerignore
arquivo para que o Docker ignore alguns arquivos. Você pode experimentar isso.Como alternativa, você pode mover sua
rpms
pasta um nível de diretório acima do seuDockerfile
, e apenas ligar novamentetest.rpm
para oDockerfile
diretório da pasta .Como muitos usuários apontaram nos comentários, é necessário adicionar a
.git
pasta à.dockerignore
qual foi a causa de uma diferença de 150 MB -> 5 GB no meu caso.fonte
ADD
comando não segue os links sym durante uma compilação. Veja: github.com/docker/docker/issues/1676tmp
log
a.dockerignore
+ outros entes personalizados.git
pasta está incluída por padrão - isso definitivamente me chamou a atenção.Atualização 2019
A partir do Docker v18.06, há uma opção para usar um novo construtor de imagens chamado Build Kit .
Ele vem com o Docker, não é necessário instalar nada. É compatível com a
Dockerfile
sintaxe, não há necessidade de alterar oDockerfile
.Legado Docker Build vs Novo Docker BuildKit
Aqui está um exemplo de criação de uma imagem com um enorme arquivo não utilizado no diretório de construção:
Construção herdada do Docker:
Novo BuildKit do Docker:
A única mudança é a
DOCKER_BUILDKIT=1
variável de ambiente, a diferença no tempo é enorme..dockerignore
ArquivoObserve que o
.dockerignore
arquivo ainda é válido e útil. AlgunsDockerfile
comandos comoCOPY . .
ainda levarão em conta as.dockerignore
regras. Mas os arquivos laterais no diretório de construção (não mencionados noDockerfile
) não estão mais sendo copiados como um "contexto de construção" pelo BuildKit.fonte
Corrigi-o movendo meu Dockerfile e docker-compose.yml para uma subpasta e funcionou muito bem. Aparentemente, o docker envia a pasta atual para o daemon e minha pasta foi de 9 GB.
fonte
Se você tiver um
.dockerignore
arquivo e o contexto de construção ainda for grande, poderá verificar o que está sendo enviado para o contexto de construção do Docker usando o Silver Searcher :Observe que alguns
**
padrões podem não funcionar corretamente.Veja esta edição do Github para comentários adicionais: https://github.com/moby/moby/issues/16056
fonte
No meu caso, foi quando eu executo com
-f
argumentos errados - sem o caminho para o diretório em que estava localizado o Dockerfiledocker build --no-cache -t nginx5 -f /home/DF/Dockerfile /home/DF/
- certodocker build --no-cache -t nginx5 -f /home/DF/Dockerfile
- erradofonte
Se você deseja ter controle total do seu contexto de construção, também poderá construir o contêiner completamente, sem nenhum contexto e
COPY
dados relevantes no contêiner posteriormente.Uma desvantagem disso seria que, com essa abordagem, você pode apenas
ADD
no arquivo docker referenciar uma URL remota, e não os arquivos do host local.Consulte https://docs.docker.com/engine/reference/commandline/build/#build-with--
fonte
Eu tive o mesmo problema que o FreeStyler. No entanto, eu estava construindo a partir de um diretório acima do meu contexto. Portanto, os argumentos -f estavam corretos, o contexto estava incorreto.
Construindo a partir do docker-dir, o seguinte foi bom
Construindo a partir do diretório-dock, o contexto de construção foi alterado. Portanto, eu precisava alterar o contexto no comando. O contexto é dado pelo '.' no comando acima.
O novo comando do diretório do projeto deve ser
O contexto aqui é fornecido pela './base'
fonte
se você estiver criando imagem e recebendo o contexto de construção do envio de mensagens para o daemon do docker, o que está demorando para ser copiado,
adicione o arquivo .dockerignore . deve incluir os arquivos ou diretório que não precisam ser copiados.
fonte
Para
NodeJS Application
, adicione um.dockerignore
arquivo ao diretório raiz do projeto e, dentro do.dockerignore
arquivo, adicione o seguintefonte