O que são imagens suspensas do Docker?

0
25


As imagens suspensas do Docker são camadas não usadas e não marcadas que existem no sistema de arquivos do seu host. Você pode não estar ciente de sua presença e eles geralmente são lixo indesejado.

Neste artigo, você aprenderá como as imagens pendentes surgem e o que você pode fazer para limpá-las. É uma boa ideia verificar periodicamente quantas imagens pendentes você tem para evitar desperdiçar a capacidade do disco.

O que é uma imagem pendurada?

Uma imagem suspensa é simplesmente uma imagem não utilizada que não tem nome ou etiqueta. Você pode detectar facilmente imagens suspensas ao executar o docker images comando porque eles aparecem como <none>:<none>.

Neste exemplo, a primeira imagem da lista é uma imagem suspensa:

$ docker images
<none>                              <none>    509bc96b727d   2 months ago    55.3MB
mysql                               5.7       f26e21ddd20d   4 months ago    450MB
gcr.io/k8s-minikube/kicbase         v0.0.30   1312ccd2422d   6 months ago    1.14GB
hello-world                         latest    feb5d9fea6a5   11 months ago   13.3kB

A imagem não é marcada, mas ainda permanece em seu sistema. Nesse caso, 55,3 MB de espaço em disco são consumidos.

Você pode verificar se a imagem está suspensa e não apenas não utilizada verificando se ela é referenciada por algum contêiner:

$ docker ps -a
CONTAINER ID   IMAGE                                      COMMAND                  CREATED          STATUS                   
2aa683500ee0   gcr.io/k8s-minikube/kicbase:v0.0.30        "/usr/local/bin/entr..."   18 hours ago     Exited (130) 18 hours ago

Nenhum recipiente se refere ao <none>:<none> imagem com identificação 509bc96b727d então está definitivamente pendurado. Observe que as imagens MySQL e Hello World Não class como pingentes – mesmo que não sejam usados ​​por contêineres, eles estão devidamente marcados, portanto, assume-se que você desejará preservá-los.

Como as imagens suspensas são criadas?

As imagens suspensas geralmente são criadas quando uma imagem existente é substituída por uma nova compilação. Aqui está um Dockerfile simples para demonstrar o que acontece:

FROM alpine:latest
COPY demo.txt /demo.txt

Crie um arquivo chamado demo.txt em seu diretório de trabalho e adicione algum conteúdo:

$ echo 1 > demo.txt

Agora construa sua imagem com docker build:

$ docker build -t demo:latest .

execute o docker images Comando para ver sua nova imagem:

REPOSITORY                          TAG       IMAGE ID       CREATED          SIZE
demo                                latest    40395b6c1362   24 seconds ago   5.54MB

Agora modifique o conteúdo de demo.txt e reconstrua sua imagem:

$ echo 2 > demo.txt
$ docker build -t demo:latest .

A mesma tag de imagem é usada: demo:latest – então esta compilação substitui a primeira. Corre docker images para ver o efeito:

REPOSITORY                          TAG       IMAGE ID       CREATED         SIZE
demo                                latest    3d5052e52b4c   3 seconds ago   5.54MB
<none>                              <none>    40395b6c1362   59 seconds ago   5.54MB

A nova imagem foi criada com ID 3d5052e52b4c e ele demo:latest etiqueta. A primeira imagem, ID 40395b6c1362, ainda existe, mas não foi marcado. Agora mostra como <none>:<none>. Esta imagem tornou-se uma imagem suspensa, pois nenhum contêiner a usa.

Você pode usar uma imagem pendurada?

As imagens suspensas funcionam como qualquer outra imagem. A única diferença é a tag que falta. Você pode iniciar um contêiner a partir de uma imagem suspensa referenciando diretamente o ID da imagem:

$ docker run -it 40395b6c1362 sh
/ #

Tecnicamente, a imagem não trava mais, porque um contêiner agora a está usando ativamente. É comum que os contêineres terminem com um none imagem se você remover ou reconstruir a tag que eles usaram. Os contêineres com uma imagem não marcada exibirão o ID da imagem no IMAGE coluna quando você executa docker psem vez da etiqueta habitual.

$ docker ps
CONTAINER ID   IMAGE                                      COMMAND                  CREATED         STATUS        PORTS                NAMES
26d5609ba75c   40395b6c1362                               "sh"                     2 seconds ago   Up 1 second                        inspiring_lederberg
91ab866b59a2   portainer/portainer-ce                     "/portainer"             2 weeks ago     Up 2 days     8000/tcp, 9443/tcp   portainer_portainer_1

Limpando imagens penduradas

Você pode remover uma única imagem suspensa usando o docker rmi comando, como qualquer outra imagem. Como a imagem não será marcada, você precisará identificá-la por seu ID.

$ docker rmi 40395b6c1362

A melhor maneira de limpar um monte de imagens penduradas é o docker image prune domínio. Isso removerá automaticamente todas as imagens pendentes em seu host Docker.

$ docker image prune
Total reclaimed space: 5.54 MB

A saída do comando mostra a quantidade de espaço em disco que foi liberada. Verifique se suas imagens estão realmente penduradas se nada for excluído. Imagens usadas ativamente por contêineres não podem ser excluídas. Você precisará remover os recipientes com docker rm primeiro, antes de tentar podar suas imagens.

Você pode descobrir que tem uma imagem pendente que realmente deseja reutilizar no futuro. Nessa situação, você pode rotulá-lo novamente com o docker tag domínio. Isso tornará a imagem mais fácil de identificar e evitará futuras operações de poda.

$ docker tag 40395b6c1362 demo:latest

Imagens exibidas como <none>:<none> eles podem não ser quadros pendurados. Confusamente, essa situação também ocorre para imagens criadas como camadas intermediárias durante uma compilação.

Cada etapa em um Dockerfile resulta na criação de uma nova camada intermediária. A imagem produzida no final da compilação recebe a tag que você especifica. As outras camadas intermediárias permanecem sem rótulo e podem ser visualizadas executando docker images -a.

Essas camadas não são imagens suspensas porque as imagens subsequentes na cadeia de construção dependem delas. Eles são referenciados por cada camada sucessiva e não causam problemas de espaço em disco. Você pode evitar que camadas intermediárias sejam preservadas no disco incluindo o --rm sinalizar em tempo de compilação:

$ docker build --rm -t demo:latest .

Resumo

As imagens suspensas são imagens do Docker não marcadas que não usam um contêiner ou dependem de um descendente. Eles geralmente são inúteis, mas ainda consomem espaço em disco. Ele acumulará imagens pendentes quando você substituir uma tag existente ao iniciar uma nova compilação.

Todas as imagens penduradas são mostradas como <none>:<none> na CLI do Docker. Ter muitos deles pode ser esmagador quando você tem dezenas de imagens sem informações sobre sua verdadeira identidade. correndo regularmente docker images prune evitará o desperdício de espaço em disco e resultará em uma lista de imagens mais curta.