Sobes.tech
Middle

Como é que o cache é feito no Docker?

sobes.tech IA

Resposta da IA

O cache no Docker baseia-se nas camadas durante a construção da imagem. O Dockerfile consiste em instruções, cada uma das quais cria uma nova camada. Em construções subsequentes, se a instrução e o seu contexto não tiverem mudado, o Docker usa a camada existente do cache em vez de executar a instrução novamente.

Fatores que afetam a invalidação do cache:

  • Alteração na instrução: Qualquer alteração na própria instrução (por exemplo, de RUN apt-get update para RUN apt-get install).
  • Alteração no contexto: Alteração de ficheiros ou diretórios utilizados pela instrução (COPY, ADD). Por exemplo, modificar o conteúdo de um ficheiro copiado para a imagem.
  • Ordem das instruções: Alterar a ordem das instruções no Dockerfile.
  • Uso de --no-cache: Desativar explicitamente o cache para toda a construção.

Processo de cache:

  1. O Docker lê o Dockerfile de cima para baixo.
  2. Para cada instrução, verifica se existe uma camada no cache local que corresponda exatamente à mesma instrução anterior e ao mesmo contexto.
  3. Se encontrar uma correspondência, o Docker reutiliza essa camada e passa para a instrução seguinte.
  4. Se não encontrar uma correspondência (cache invalidado), o Docker executa a instrução, cria uma nova camada e a adiciona ao cache. Todas as instruções seguintes após a invalidação também não usarão o cache.

Exemplo de impacto da ordem das instruções:

Suponha que tenha um Dockerfile que copia primeiro o seu código e depois instala dependências. Se alterar frequentemente o código, mas raramente as dependências, o cache da instalação das dependências será inútil, pois sempre que o código mudar, o cache na etapa COPY será invalidado.

# Dockerfile 1 (Mau cache com alterações frequentes no código)
COPY . /app
RUN pip install -r requirements.txt

Alterar a ordem das instruções pode melhorar o cache:

# Dockerfile 2 (Bom cache com alterações frequentes no código)
COPY requirements.txt /app/
RUN pip install -r /app/requirements.txt
COPY . /app

Neste caso, se apenas o código mudar (não requirements.txt), o cache para RUN pip install será mantido.

As instruções ADD e COPY usam um hash do conteúdo dos ficheiros para invalidar o cache.

O comando docker build usa o cache por padrão. Para desativar o cache, usa-se a bandeira --no-cache.

# Construção usando cache (por padrão)
docker build -t myimage .

# Construção sem usar cache
docker build --no-cache -t myimage .