Tenho alguns RUN
comandos em meu Dockerfile que gostaria de executar -no-cache
sempre que construir uma imagem Docker.
Eu entendo docker build --no-cache
que desabilitará o cache de todo o Dockerfile.
É possível desabilitar o cache para um comando RUN específico?
Respostas:
Sempre há uma opção de inserir algum comando sem sentido e barato para executar antes da região para a qual deseja desabilitar o cache.
Conforme proposto neste comentário de problema , pode-se adicionar um bloco de argumento de construção (o nome pode ser arbitrário):
antes dessa região, e modifique seu valor a cada execução adicionando-o
--build-arg CACHEBUST=$(date +%s)
como umdocker build
argumento (o valor também pode ser arbitrário, aqui é a data e hora atual, para garantir sua exclusividade nas execuções).Isso, é claro, desabilitará o cache para todos os blocos seguintes também, já que a soma do hash da imagem intermediária será diferente, o que torna a desativação realmente seletiva do cache um problema não trivial, levando em consideração como o docker funciona atualmente.
fonte
---> Using cache
na linha `` ARG CACHEBUST = 1` ... (e sim, fiz--build-arg CACHEBUST=$(date +%s)
no meu comando docker)RUN echo "$CACHEBUST"
porque apenas usarARG
não invalidará o cacheUsar
antes da linha RUN que você deseja executar sempre. Isso funciona porque o ADD sempre buscará o arquivo / URL e o URL acima gera dados aleatórios em cada solicitação. O Docker então compara o resultado para ver se pode usar o cache.
Eu também testei isso e funciona muito bem, pois não requer nenhum argumento de linha de comando Docker adicional e também funciona a partir de um arquivo Docker-compose.yaml :)
fonte
Não diretamente, mas você pode dividir seu Dockerfile em várias partes, construir uma imagem e, em seguida, FROM thisimage no início do próximo Dockerfile e construir a imagem com ou sem cache
fonte
A partir de fevereiro de 2016, não é possível.
O recurso foi solicitado no GitHub
fonte
o recurso adicionado há uma semana.
https://github.com/moby/moby/issues/1996#issuecomment-550020843
fonte
Eu acredito que esta é uma pequena melhoria na resposta de @steve, acima:
Isso usa o cache do Docker do clone git, mas depois executa uma atualização sem cache do repositório.
Ele aparece para trabalhar, e é mais rápido - mas muitas graças a @ Steve para fornecer os princípios subjacentes.
fonte
Outro truque rápido é escrever alguns bytes aleatórios antes do seu comando
grava 5 bytes aleatórios que forçará uma falha de cache
fonte