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 updateparaRUN 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:
- O Docker lê o Dockerfile de cima para baixo.
- Para cada instrução, verifica se existe uma camada no cache local que corresponda exatamente à mesma instrução anterior e ao mesmo contexto.
- Se encontrar uma correspondência, o Docker reutiliza essa camada e passa para a instrução seguinte.
- 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 .