Ao executar novamente o comando abaixo a construção é muito mais rápida porque o Docker possui armazenamento em cache das camadas utilizadas para a construção da imagem:
=> [2/3] RUN apt update 9.5s
=> [3/3] RUN apt install curl --yes 5.8s
Mais instruções abaixo
Se o arquivo Dockerfile for alterado para adicionar mais instruções abaixo do que já estava escrito, o Docker utilizará o cache também:
# define a imagem base
FROM ubuntu
# executa comandos durante a construcao da imagem
RUN apt update
RUN apt install curl --yes
# linha adicionada
RUN apt install vim --yes
No exemplo acima será utilizado o cache das camadas RUN apt update e RUN apt install curl --yes.
As camadas ficarão da seguinte maneira:
$ docker build -t ubuntu-curl -f Dockerfile .
[+] Building 6.4s (8/8) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 211B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:latest 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/4] FROM docker.io/library/ubuntu:latest 0.0s
=> CACHED [2/4] RUN apt update 0.0s
=> CACHED [3/4] RUN apt install curl --yes 0.0s
=> [4/4] RUN apt install vim --yes 6.1s
=> exporting to image 0.3s
=> => exporting layers 0.2s
=> => writing image sha256:f03db767f5231d0cc49732bdb31e302ea51eedf361028f7c 0.0s
=> => naming to docker.io/library/ubuntu-curl 0.0s
Destaque para:
=> CACHED [2/4] RUN apt update 0.0s
=> CACHED [3/4] RUN apt install curl --yes 0.0s
=> [4/4] RUN apt install vim --yes 6.1s
Mais instruções no meio
Se alguma instrução em cache for alterada, serão utilizadas as camadas de cache até a primeira alteração encontrada. Por exemplo, se for inserida uma linha antes de RUN apt install curl --yes, será considerado o cache até a instrução RUN apt update somente.
# define a imagem base
FROM ubuntu
# executa comandos durante a construcao da imagem
RUN apt update
# linha inserida
RUN apt install git --yes
RUN apt install curl --yes
RUN apt install vim --yes
$ docker build -t ubuntu-curl -f Dockerfile .
[+] Building 20.3s (9/9) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 238B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:latest 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/5] FROM docker.io/library/ubuntu:latest 0.0s
=> CACHED [2/5] RUN apt update 0.0s
=> [3/5] RUN apt install git --yes 9.4s
=> [4/5] RUN apt install curl --yes 3.8s
=> [5/5] RUN apt install vim --yes 6.5s
=> exporting to image 0.5s
=> => exporting layers 0.4s
=> => writing image sha256:1abfc81f8c73c0b58fa0a63b5fb8854d69e9884b13458899 0.0s
=> => naming to docker.io/library/ubuntu-curl 0.0s
Destaque para:
=> CACHED [2/5] RUN apt update 0.0s
=> [3/5] RUN apt install git --yes 9.4s
=> [4/5] RUN apt install curl --yes 3.8s
=> [5/5] RUN apt install vim --yes 6.5s
Armadilhas
Existem algumas armadilhas na construção do cache.
Verificar a versão mais recente do curl:
$ apt search curl
curl/jammy-updates,jammy-security,now 7.81.0-1ubuntu1.17 amd64 [installed]
command line tool for transferring data with URL syntax
Se for desejado o versionamento da instalação do curl conforme abaixo pode ocorrer erro na construção da imagem porque somente a versão foi alterada:
# define a imagem base
FROM ubuntu
# executa comandos durante a construcao da imagem
# atualização dos pacotes disponíveis para atualização dos repositórios
RUN apt update
# instalação do curl
# versao 15/11/2023
# RUN apt install curl=7.81.0-1ubuntu1.14 --yes
# versao 22/08/2024
RUN apt install curl=7.81.0-1ubuntu1.17 --yes
Para evitar isso inserir uma única instrução passando pela atualização dos pacotes disponíveis para atualização dos repositórios e instalação do curl, conforme abaixo:
# define a imagem base
FROM ubuntu
# executa comandos durante a construcao da imagem
# atualizacao dos pacotes disponiveis dos repositorios
# instalacao do curl
RUN apt update && apt install curl=7.81.0-1ubuntu1.17 --yes
Com isso o cache não será um problema na instalação do comando curl.