O que é uma imagem pendente e o que é uma imagem não utilizada?

155

Na documentação do docker da remoção de imagem do docker , é possível usar o sinalizador -a para

Remova todas as imagens não utilizadas, não apenas as dangling

e depois

Remova todas as imagens pendentes. Se -a for especificado, também removerá todas as imagens não referenciadas por qualquer contêiner.

Alguém pode me explicar o que são imagens pendentes e qual é a diferença entre imagens pendentes e não utilizadas?

herm
fonte
remoção de imagem do docker (sem -a) faz exatamente o mesmo embora
herm
Falha ao usar isso no jenkins, perderemos o backup do docker em produção se dependermos do cache da imagem do docker. prunenão é recomanded na produção /
Jinna Balu

Respostas:

153

Uma imagem não utilizada significa que não foi atribuída ou usada em um contêiner. Por exemplo, ao executar docker ps -a- ele listará todos os contêineres existentes e atualmente em execução. Todas as imagens mostradas em uso em qualquer um dos contêineres são uma "imagem usada".

Por outro lado, uma imagem pendente significa apenas que você criou a nova compilação da imagem, mas não recebeu um novo nome. Portanto, as imagens antigas que você possui se tornam a "imagem pendente". Essas imagens antigas são as que não estão marcadas e exibem " <none>" seu nome quando você executa docker images.

Ao executar docker system prune -a, ele removerá as imagens não utilizadas e danificadas. Portanto, quaisquer imagens sendo usadas em um contêiner, sejam elas encerradas ou atualmente em execução, NÃO serão afetadas.

Serey
fonte
De acordo com a documentação ao executar a remoção do docker sem -a, apenas as imagens pendentes são removidas. -a garantirá que as imagens não utilizadas também sejam excluídas, certo? docs.docker.com/engine/reference/commandline/system_prune
herm
1
Muito interessante. Portanto, uma imagem pendente pode ser usada por um contêiner. Nota: O Docker avisa se existem contêineres que estão usando essas imagens sem marcação.
Herm
7
docker system prune --all --filter "until=24h"preserva imagens recentes também
Harry Moreno
1
De acordo com docs.docker.com/engine/reference/commandline/system_prune/…, também docker system prune -a remove os contêineres parados. Portanto, ele também deve remover imagens associadas apenas aos contêineres encerrados, certo?
Lfk 14/05/19
41

Maneira mais fácil e segura de limpar Dangling Images

docker images --quiet --filter=dangling=true | xargs --no-run-if-empty docker rmi

As imagens do Docker consistem em várias camadas. Imagens pendentes são camadas que não têm relação com nenhuma imagem marcada. Eles não servem mais a um propósito e consomem espaço em disco.

Nota: eu recomendo não usar prunena produção, porque docker system prune -aremoverá todas as imagens que não são referenciadas pelo contêiner, pelas quais não podemos reverter para a versão anterior.

Para listar imagens pendentes adicionando o sinalizador de filtro, -fcom um valor igual dangling=truea docker images.

Listar imagens pendentes

docker images -f dangling=true

Remover imagens pendentes

docker rmi $(docker images -f dangling=true -q)

OU

docker images --quiet --filter=dangling=true | xargs --no-run-if-empty docker rmi

Quando executamos tarefas cron para excluir os itens pendentes, use o item acima para garantir que a tarefa seja executada com êxito. Como em Jenkins, se executarmos um trabalho de estilo livre com um belo trabalho de vingança nunca falhará, mesmo que não exista nenhum material danificado na máquina.

Essa é a maneira mais segura e fácil de limpar imagens pendentes e recuperar o espaço em disco para uso.

Jinna Balu
fonte
2
e quanto à remoção da imagem do docker? Os documentos dizem: "Remova todas as imagens pendentes. Se -a for especificado, também removerá todas as imagens não referenciadas por nenhum contêiner". docs.docker.com/engine/reference/commandline/image_prune/…
herm
2
@herm, na parte inferior da página que você referenciou "Observação: você é solicitado a confirmar antes que a ameixa remova qualquer coisa, mas não é exibida uma lista do que será potencialmente removido". Acho que o ponto nesta resposta é que você pode obter uma lista das imagens pendentes, que você especifica explicitamente para serem removidas, em vez de remover cegamente todas as imagens pendentes com poda.
bzier
As imagens com nome e marca como nenhuma docker imagesestão danificadas. Como verificar seu tamanho? Além disso, as imagens com nome e marca como nenhuma docker images -asão imagens intermediárias. Eles podem ser excluídos e como verificar seu tamanho?
variável
17

As imagens na janela de encaixe são referenciadas por um resumo sha256, geralmente chamado de ID da imagem. Esse resumo é tudo o que você precisa para que a imagem exista no host da janela de encaixe. Normalmente, você terá tags que apontam para esses resumos, por exemplo, a tag busybox: os pontos atuais mais recentes para o id da imagem c30178c523 ... no meu sistema. Múltiplas tags podem apontar para a mesma imagem, e qualquer tag pode ser alterada para apontar para um ID diferente, por exemplo, quando você obtém uma nova cópia do busybox: latest ou cria uma nova versão da imagem do aplicativo.

Imagens pendentes são imagens que não possuem uma marca e não possuem uma imagem filha (por exemplo, uma imagem antiga que usou uma versão diferente FROM busybox:latest), apontando para elas. Eles podem ter uma tag apontando para eles antes e depois alterada. Ou eles podem nunca ter tido uma tag (por exemplo, a saída de um docker buildsem incluir a opção tag). Geralmente, é seguro removê-los, desde que ainda não haja contêineres em execução que façam referência ao ID da imagem antiga. O principal motivo para mantê-los por perto é para fins de cache de construção.

Além disso, você pode ter baixado imagens que atualmente não são usadas por contêineres (incluindo contêineres parados). Elas são totalmente diferentes das imagens pendentes e podem ser removidas com segurança, desde que você não planeje usá-las no futuro ou não se importe de baixar outra cópia quando precisar.

BMitch
fonte
Enquanto uma compilação do docker estiver em execução (o processo no qual ele cria camadas e possíveis candidatos para futuras imagens pendentes), em uma nova janela se eu executar a remoção da imagem do docker, isso afetará a compilação em andamento de alguma maneira?
variável
@ variável, pode haver uma condição de corrida, mas normalmente o contêiner em execução para uma etapa de construção resultará na identificação da imagem como em uso. O pior que pode acontecer é a ameixa emite um erro ou a compilação causa, e você teria que executá-lo novamente. Gostaria de saber se você pode limitar sua remoção para evitar imagens que você está usando atualmente para criar, pois uma remoção bem-sucedida resultará em futuras compilações que precisam baixar imagens novamente.
BMitch
As imagens intermediárias (aquelas que não possuem nome / etiqueta exibidas na execução docker images -a) também são chamadas de imagens danificadas? Eles são limpos com a remoção da imagem do docker?
variável
Eu não tenho mais isso no meu ambiente (usando o buildkit aqui), então recomendo tentar você mesmo em um ambiente de laboratório para ver o que acontece.
BMitch
Dito isto, excluir as "imagens" não marcadas dos estágios intermediários é bastante inútil, a menos que você exclua a imagem final marcada, todas as camadas serão reutilizadas em uma imagem posterior e não poderão ser excluídas. Se você excluí-los, destruirá o cache de compilação e fará com que todas as imagens futuras levem mais tempo para compilar e espaço em disco para armazenar.
BMitch
5

Imagens pendentes são camadas que não têm relação com nenhuma imagem marcada. Eles não servem mais a um propósito e consomem espaço em disco.

Uma imagem não utilizada é uma imagem que não foi atribuída ou usada em um contêiner.

Listar imagens pendentes

docker images -f dangling=true
subh2273
fonte
3

imagens pendentes são imagens não marcadas. O comando a seguir fornece uma lista de imagens pendentes.

docker images --filter "dangling=true"

docker image prune exclui todas as imagens pendentes.

Imagens não usadas são imagens que possuem tags, mas que atualmente não estão sendo usadas como um contêiner. Você pode ou não precisar dele no futuro.

docker image prune -a exclua todas as imagens pendentes e não utilizadas.

Geralmente, você não deseja remover todas as imagens não utilizadas até algum tempo. Por isso, é melhor remover com um filtro.

docker image prune -f --filter "until=6h"

Venkat Kotra
fonte
1) docker image prune -a -f --filter "until=6h"Também exclui imagens pendentes?
variável
2) No seu último comando, você menciona docker image prune -f --filter "until=6h"- como não existe um - a - então por que ele removerá imagens não utilizadas?
variável
0

Vi comandos úteis (aliases) para remover imagens pendentes, cortesia de andyneff aqui: https://forums.docker.com/t/how-to-delete-cache/5753 :

alias docker_clean_images='docker rmi $(docker images -a --filter=dangling=true -q)' 
alias docker_clean_ps='docker rm $(docker ps --filter=status=exited --filter=status=created -q)' 

O primeiro limpa todas as imagens pendentes. Isso é útil para remover imagens intermediárias que sobraram de várias compilações. O segundo é para remover recipientes parados. Esses são pseudônimos que eu uso para manutenção de rotina

Se você deseja remover TODO o seu cache, primeiro é necessário garantir que todos os contêineres sejam parados e removidos, pois não é possível remover uma imagem em uso por um contêiner. Então, algo semelhante

docker kill $(docker ps -q) docker_clean_ps docker rmi $(docker images
-a -q)

Isso mataria e removeria todas as imagens no seu cache.

Alexei Martianov
fonte
0

Na captura de tela das imagens, o nome "none" é dangling. Uma imagem pendente significa apenas que você criou a nova compilação da imagem, mas não recebeu um novo nome. Portanto, as imagens antigas que você possui se tornam a "imagem pendente". Essas imagens antigas são as que não estão marcadas e exibem "" seu nome quando você executa imagens de janela de encaixe.

docker system prune -a, removerá as imagens não utilizadas e pendentes. Portanto, quaisquer imagens sendo usadas em um contêiner, sejam elas encerradas ou atualmente em execução, NÃO serão afetadas.

Nirbhay Singh
fonte