Cos'è un'immagine penzolante e cos'è un'immagine inutilizzata?


157

Nella documentazione della finestra mobile della prugna immagine della finestra mobile è possibile utilizzare il flag -a per

Rimuovi tutte le immagini inutilizzate, non solo quelle penzolanti

e più tardi

Rimuovi tutte le immagini pendenti. Se viene specificato -a, verranno rimosse anche tutte le immagini a cui non fa riferimento alcun contenitore.

Qualcuno può spiegarmi cosa sono le immagini penzolanti e qual è la differenza tra immagini penzolanti e inutilizzate?


docker image prune (senza -a) fa esattamente lo stesso però
herm

Non funziona quando lo usi in jenkins, perderemo il backup della finestra mobile in produzione se dipendiamo dalla cache dell'immagine della finestra mobile. prunenon è raccomandato in produzione /
Jinna Balu

Risposte:


156

Un'immagine inutilizzata significa che non è stata assegnata o utilizzata in un contenitore. Ad esempio, durante l'esecuzione docker ps -a: elencherà tutti i contenitori usciti e attualmente in esecuzione. Qualsiasi immagine mostrata mentre viene utilizzata all'interno di uno qualsiasi dei contenitori è una "immagine usata".

D'altra parte, un'immagine penzolante significa solo che hai creato la nuova build dell'immagine, ma non gli è stato dato un nuovo nome. Quindi le vecchie immagini che hai diventano "immagini penzolanti". Quella vecchia immagine è quella che non ha tag e mostra " <none>" sul suo nome quando corri docker images.

Durante l'esecuzione docker system prune -a, rimuoverà le immagini non utilizzate e penzolanti. Pertanto, qualsiasi immagine utilizzata in un contenitore, indipendentemente dal fatto che sia stata abbandonata o in esecuzione, NON sarà interessata.


Secondo la documentazione quando si esegue la docker potatura senza -a vengono rimosse solo le immagini pendenti. -a assicurerà che anche le immagini inutilizzate vengano eliminate, giusto? docs.docker.com/engine/reference/commandline/system_prune
herm


1
Molto interessante. Quindi un'immagine sospesa può essere utilizzata da un contenitore. Nota: Docker avvisa se esistono contenitori che utilizzano queste immagini senza tag.
Herm

7
docker system prune --all --filter "until=24h"conserva anche le immagini recenti
Harry Moreno

1
Secondo docs.docker.com/engine/reference/commandline/system_prune/… docker system prune -a rimuove anche i contenitori chiusi. Quindi dovrebbe rimuovere anche le immagini associate solo ai contenitori usciti, giusto?
Lfk

41

Il modo più sicuro e semplice per ripulire le immagini pendenti

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

Le immagini Docker sono composte da più livelli. Immagini ciondolanti, sono livelli che non hanno alcuna relazione con alcuna immagine taggata. Non servono più a uno scopo e consumano spazio su disco.

Nota: consiglio di non utilizzare prunein produzione, perché docker system prune -arimuoveranno tutte le immagini a cui non fa riferimento il contenitore, per cui non possiamo tornare alla versione precedente.

Per elencare le immagini sospese aggiungendo il flag di filtro, -fcon un valore di dangling=truea docker images.

Elenco immagini penzoloni

docker images -f dangling=true

Rimuovi immagini penzolanti

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

O

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

Quando eseguiamo processi cron per eliminare le cose sospese, utilizzare quanto sopra per assicurarsi che il processo venga eseguito correttamente. Come in Jenkins, se eseguiamo un lavoro in stile libero con un lavoro commando beloow non fallirà mai, anche se nella macchina non esistono oggetti penzolanti.

Questo è il modo più sicuro e semplice per ripulire le immagini appese e recuperare lo spazio su disco per l'uso.


2
che dire di docker image prune? I documenti dicono: "Rimuovi tutte le immagini sospese. Se viene specificato -a, rimuoverà anche tutte le immagini a cui non fa riferimento alcun contenitore." docs.docker.com/engine/reference/commandline/image_prune/…
herm

2
@herm, dalla parte inferiore della pagina a cui hai fatto riferimento "Nota: ti viene richiesta la conferma prima che la prugna rimuova qualcosa, ma non ti viene mostrato un elenco di ciò che sarà potenzialmente rimosso". Penso che il punto in questa risposta sia che puoi ottenere un elenco delle immagini penzolanti, che poi specifichi esplicitamente da rimuovere, invece di rimuovere ciecamente tutte le immagini penzolanti con la prugna.
Bzier,

Le immagini che hanno nome e tag come nessuna in docker imagessono appese. Come controllare le loro dimensioni? Inoltre, le immagini che hanno nome e tag come nessuna in docker images -asono immagini intermedie. Possono essere eliminati e come controllarne le dimensioni?
variabile

17

Le immagini nella finestra mobile sono indicate da un digest sha256, spesso indicato come ID immagine. Questo digest è tutto ciò che serve affinché l'immagine esista sull'host docker. In genere, avrai tag che puntano a questi digest, ad esempio il tag busybox: gli ultimi punti correnti all'ID immagine c30178c523 ... sul mio sistema. Più tag possono puntare alla stessa immagine e qualsiasi tag può essere modificato per puntare a un ID diverso, ad esempio quando si estrae una nuova copia di busybox: latest o si crea una nuova versione dell'immagine dell'applicazione.

Le immagini pendenti sono immagini che non hanno un tag e non hanno un'immagine figlio (ad esempio una vecchia immagine che utilizzava una versione diversa di FROM busybox:latest), che punta a loro. Potrebbe aver avuto un tag che punta a loro prima e quel tag in seguito è cambiato. Oppure potrebbero non aver mai avuto un tag (ad esempio l'output di a docker buildsenza includere l'opzione tag). Questi sono generalmente sicuri da rimuovere se non sono ancora in esecuzione contenitori che fanno riferimento al vecchio ID immagine. Il motivo principale per tenerli in giro è per scopi di memorizzazione nella cache.

Inoltre, è possibile che siano state scaricate immagini che non sono attualmente utilizzate dai contenitori (compresi i contenitori arrestati). Questi sono completamente diversi dalle immagini pendenti e possono essere sicuri da rimuovere se non prevedi di usarli in futuro o non ti dispiace scaricare un'altra copia quando ne hai bisogno.


Mentre è in esecuzione una build docker (il processo in cui crea layer e possibili candidati per le immagini penzolanti future), in una nuova finestra se eseguo la prugna immagine docker, influenzerà in qualche modo la build in corso?
variabile

@variable potrebbe esserci una condizione di competizione, ma in genere il contenitore in esecuzione per una fase di generazione comporterà l'identificazione dell'immagine come in uso. Il peggio che potrebbe accadere è o la prugna genera un errore, oppure la build lo fa e dovresti rieseguirlo. Verificherei se puoi limitare la tua prugna per evitare le immagini che stai attualmente usando per costruire poiché una prugna di successo comporterà che le build future debbano scaricare di nuovo le immagini.
BMitch

Le immagini intermedie (quelle che non mostrano alcun nome / tag durante l'esecuzione docker images -a) sono anche chiamate immagini appese? Vengono cancellati con la prugna immagine docker?
variabile

Non li ho più nel mio ambiente (usando buildkit qui), quindi consiglierei di provare te stesso in un ambiente di laboratorio per vedere cosa succede.
BMitch

Detto questo, eliminare le "immagini" senza tag dalle fasi intermedie è abbastanza inutile, a meno che non si elimini l'immagine con tag finale, tutti i livelli vengono riutilizzati in un'immagine successiva e non possono essere eliminati. Se li elimini, distruggi la cache di build e fai sì che tutte le immagini future impieghino più tempo per la creazione e lo spazio su disco per l'archiviazione.
BMitch

5

Le immagini pendenti sono livelli che non hanno alcuna relazione con alcuna immagine taggata. Non servono più a uno scopo e consumano spazio su disco.

Un'immagine non utilizzata è un'immagine che non è stata assegnata o utilizzata in un contenitore.

Elenco immagini penzoloni

docker images -f dangling=true

3

le immagini pendenti sono immagini senza tag. Il seguente comando fornisce un elenco di immagini sospese.

docker images --filter "dangling=true"

docker image prune elimina tutte le immagini sospese.

Le immagini inutilizzate sono immagini che hanno tag ma che al momento non vengono utilizzate come contenitore. Potrebbe essere necessario o meno in futuro.

docker image prune -a elimina tutte le immagini pendenti e non utilizzate.

In genere non si desidera rimuovere tutte le immagini non utilizzate fino a qualche tempo. Quindi è meglio rimuovere con un filtro.

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


1) docker image prune -a -f --filter "until=6h"Elimina anche le immagini appese?
variabile

2) Nel tuo ultimo comando hai citato docker image prune -f --filter "until=6h"- poiché non c'è -a - allora come mai rimuoverà le immagini inutilizzate?
variabile

0

Ho visto utili comandi (alias) per la rimozione di immagini sospese, per gentile concessione di andyneff qui: 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)' 

Il primo pulisce tutte le immagini sospese. Questo è utile per rimuovere le immagini intermedie rimaste da più build. Il secondo è per la rimozione di contenitori fermi. Questi sono alias che uso per la manutenzione ordinaria

Se si desidera rimuovere TUTTA la cache, è necessario innanzitutto assicurarsi che tutti i contenitori siano stati arrestati e rimossi, poiché non è possibile rimuovere un'immagine in uso da un contenitore. Quindi qualcosa di simile

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

Ciò ucciderebbe e rimuovere tutte le immagini nella cache.


0

Nello screenshot delle immagini, il nome "nessuno" sono immagini pendenti. Un'immagine penzolante significa solo che hai creato la nuova build dell'immagine, ma non gli è stato dato un nuovo nome. Quindi le vecchie immagini che hai diventano "immagini penzolanti". Quelle vecchie immagini sono quelle che non sono etichettate e mostrano "" sul suo nome quando si eseguono immagini docker.

docker system prune -a, rimuoverà le immagini non utilizzate e penzolanti. Pertanto, eventuali immagini utilizzate in un contenitore, siano state uscite o attualmente in esecuzione, NON saranno interessate.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.