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 Dockerfilesintaxe, não há necessidade de alterar o Dockerfile.
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:
$ time docker image build --no-cache .
Sending build context to Docker daemon 4.315GB
[...]
Successfully built c9ec5d33e12e
real 0m51.035s
user 0m7.189s
sys 0m10.712s
Novo BuildKit do Docker:
$ time DOCKER_BUILDKIT=1 docker image build --no-cache .
[+] Building 0.1s (5/5) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 37B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
[...]
=> => writing image sha256:ba5bca3a525ac97573b2e1d3cb936ad50cf8129eedfa9 0.0s
real 0m0.166s
user 0m0.034s
sys 0m0.026s
A única mudança é a DOCKER_BUILDKIT=1variável de ambiente, a diferença no tempo é enorme.
.dockerignore Arquivo
Observe que o .dockerignorearquivo ainda é válido e útil. Alguns Dockerfilecomandos como COPY . .ainda levarão em conta as .dockerignoreregras. Mas os arquivos laterais no diretório de construção (não mencionados no Dockerfile) não estão mais sendo copiados como um "contexto de construção" pelo BuildKit.