¿Qué es una imagen colgante y qué es una imagen no utilizada?

155

En la documentación de Docker de la poda de imágenes de Docker , es posible usar el indicador -a para

Elimine todas las imágenes no utilizadas, no solo las que cuelgan

y después

Eliminar todas las imágenes colgantes. Si se especifica -a, también eliminará todas las imágenes a las que ningún contenedor haga referencia.

¿Alguien puede explicarme qué son las imágenes colgantes y cuál es la diferencia entre las imágenes colgantes y las imágenes no utilizadas?

herm
fuente
sin embargo, la poda de la imagen de Docker (sin -a) hace exactamente lo mismo
herm
Falla cuando se usa eso en jenkins, perderemos la copia de seguridad de la ventana acoplable en producción si dependemos de la memoria caché de imágenes de la ventana acoplable. pruneno se recomienda en producción /
Jinna Balu

Respuestas:

153

Una imagen no utilizada significa que no ha sido asignada o utilizada en un contenedor. Por ejemplo, cuando se ejecuta docker ps -a: enumerará todos los contenedores que se están ejecutando actualmente. Las imágenes que se muestran que se usan dentro de cualquiera de los contenedores son una "imagen usada".

Por otro lado, una imagen colgante solo significa que ha creado la nueva construcción de la imagen, pero no se le dio un nuevo nombre. Entonces las viejas imágenes que tienes se convierten en la "imagen colgante". Esas viejas imágenes son las que no están etiquetadas y muestran " <none>" su nombre cuando corres docker images.

Cuando se ejecuta docker system prune -a, eliminará las imágenes colgantes y no utilizadas. Por lo tanto, las imágenes que se usen en un contenedor, ya sea que se hayan salido o que se estén ejecutando actualmente, NO se verán afectadas.

Serey
fuente
De acuerdo con la documentación cuando se ejecuta la podadora Docker sin -a solo se eliminan las imágenes colgantes. -a garantizará que las imágenes no utilizadas también se eliminen, ¿verdad? docs.docker.com/engine/reference/commandline/system_prune
herm
1
Muy interesante. Por lo tanto, un contenedor puede usar una imagen colgante. Nota: Docker le advierte si existen contenedores que utilizan estas imágenes sin etiquetar.
herm
77
docker system prune --all --filter "until=24h"conserva imágenes recientes también
Harry Moreno
1
De acuerdo con docs.docker.com/engine/reference/commandline/system_prune/… también docker system prune -a elimina los contenedores detenidos. Por lo tanto, también debería eliminar imágenes asociadas solo con contenedores salidos, ¿verdad?
lfk
41

La forma más segura y fácil de limpiar imágenes colgantes

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

Las imágenes de Docker consisten en múltiples capas. Las imágenes colgantes son capas que no tienen relación con ninguna imagen etiquetada. Ya no tienen un propósito y consumen espacio en disco.

Nota: Recomiendo no usar pruneen producción, porque docker system prune -aeliminará todas las imágenes a las que el contenedor no hace referencia, por lo que no podemos retroceder a la versión anterior.

Para enumerar colgando imágenes mediante la adición de la bandera del filtro, -fcon un valor de dangling=trueal docker images.

Lista de imágenes colgantes

docker images -f dangling=true

Eliminar imágenes colgantes

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

O

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

Cuando ejecutamos cualquier trabajo cron para eliminar las cosas colgantes, use lo anterior para asegurarse de que el trabajo se ejecute correctamente. Al igual que en Jenkins, si ejecutamos un trabajo de estilo libre con el siguiente comando, el trabajo nunca fallará, incluso si no existen elementos colgantes en la máquina.

Esta es la forma más segura y fácil de limpiar imágenes colgantes y recuperar nuestro espacio en disco para su uso.

Jinna Balu
fuente
2
¿Qué pasa con la poda de imagen de Docker? Los documentos dicen: "Elimine todas las imágenes colgantes. Si se especifica -a, también eliminará todas las imágenes a las que ningún contenedor haga referencia". docs.docker.com/engine/reference/commandline/image_prune/…
herm
2
@herm, desde la parte inferior de la página a la que hizo referencia "Nota: se le solicita confirmación antes de que la ciruela elimine algo, pero no se le muestra una lista de lo que se eliminará potencialmente". Creo que el punto en esta respuesta es que puede obtener una lista de las imágenes colgantes, que luego especifica explícitamente que se eliminarán, en lugar de eliminar ciegamente todas las imágenes colgantes con ciruela.
Bzier
Las imágenes que tienen nombre y etiqueta como ninguna docker imagesestán colgadas. ¿Cómo verificar su tamaño? Además, las imágenes que tienen nombre y etiqueta como none en docker images -ason imágenes intermedias. ¿Se pueden eliminar y cómo verificar su tamaño?
variable
17

Las imágenes en la ventana acoplable están referenciadas por un resumen de sha256, a menudo denominado id de imagen. Ese resumen es todo lo que necesita para que la imagen exista en el host docker. Por lo general, tendrá etiquetas que apuntan a estos resúmenes, por ejemplo, la etiqueta busybox: los últimos puntos actuales para la identificación de imagen c30178c523 ... en mi sistema. Varias etiquetas pueden apuntar a la misma imagen, y cualquier etiqueta puede cambiarse para apuntar a una identificación diferente, por ejemplo, cuando extrae una nueva copia de busybox: último o crea una nueva versión de la imagen de su aplicación.

Las imágenes colgantes son imágenes que no tienen una etiqueta, y no tienen una imagen secundaria (por ejemplo, una imagen antigua que usaba una versión diferente de FROM busybox:latest), apuntando a ellas. Es posible que hayan tenido una etiqueta apuntando hacia ellos antes y esa etiqueta cambió más tarde. O puede que nunca hayan tenido una etiqueta (por ejemplo, la salida de a docker buildsin incluir la opción de etiqueta). Por lo general, es seguro eliminarlos siempre que no se sigan ejecutando contenedores que hagan referencia a la identificación de la imagen anterior. La razón principal para mantenerlos es para propósitos de almacenamiento en caché.

Además, es posible que haya descargado imágenes que actualmente no utiliza los contenedores (incluidos los contenedores detenidos). Estas son completamente diferentes de las imágenes colgantes y pueden eliminarse con seguridad siempre que no planee usarlas en el futuro o no le importe descargar otra copia cuando las necesite.

BMitch
fuente
Mientras se ejecuta una construcción de Docker (el proceso en el que crea capas y posibles candidatos para futuras imágenes colgantes), en una nueva ventana, si ejecuto la poda de imágenes de Docker, ¿afectará de alguna manera la construcción en progreso?
variable
@variable podría haber una condición de carrera allí, pero generalmente el contenedor de ejecución para un paso de compilación dará como resultado que la imagen se identifique como en uso. Lo peor que puede suceder es que la ciruela pasa un error, o la construcción lo hace, y tendrías que volver a ejecutarlo. Investigaría si puede limitar su poda para evitar las imágenes que está utilizando actualmente para construir, ya que una poda exitosa resultará en futuras compilaciones que deberán descargar imágenes nuevamente.
BMitch
¿Las imágenes intermedias (aquellas que no tienen nombre / etiqueta que se muestran al ejecutarse docker images -a) también se llaman imágenes colgadas? ¿Se borran con la poda de imagen de la ventana acoplable?
variable
Ya no los tengo en mi entorno (usando el kit de compilación aquí), por lo que recomiendo probarse en un entorno de laboratorio para ver qué sucede.
BMitch
Dicho esto, eliminar las "imágenes" sin etiquetar de las etapas intermedias es bastante inútil, a menos que elimine la imagen etiquetada final, todas las capas se reutilizan en una imagen posterior y no se pueden eliminar. Si los elimina, destruye su caché de compilación y hace que todas las imágenes futuras tomen más tiempo para compilarse y espacio en disco para almacenar.
BMitch
5

Las imágenes colgantes son capas que no tienen relación con ninguna imagen etiquetada. Ya no tienen un propósito y consumen espacio en disco.

Una imagen no utilizada es una imagen que no ha sido asignada o utilizada en un contenedor.

Lista de imágenes colgantes

docker images -f dangling=true
subh2273
fuente
3

las imágenes colgantes son imágenes sin etiquetar. El siguiente comando proporciona una lista de imágenes colgantes.

docker images --filter "dangling=true"

docker image prune elimina todas las imágenes colgantes.

Las imágenes no utilizadas son imágenes que tienen etiquetas pero que actualmente no se utilizan como contenedor. Puede que lo necesite o no en el futuro.

docker image prune -a elimine todas las imágenes colgantes y no utilizadas.

Por lo general, no desea eliminar todas las imágenes no utilizadas hasta cierto tiempo. Por lo tanto, es mejor eliminar con un filtro.

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

Venkat Kotra
fuente
1) ¿ docker image prune -a -f --filter "until=6h"También elimina las imágenes colgantes?
variable
2) En su último comando, menciona docker image prune -f --filter "until=6h", ya que no hay -a, ¿entonces cómo eliminará las imágenes no utilizadas?
variable
0

Vi comandos útiles (alias) para eliminar imágenes colgantes, cortesía de andyneff aquí: 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)' 

El primero limpia todas las imágenes colgantes. Esto es útil para eliminar imágenes intermedias sobrantes de múltiples compilaciones. El segundo es para eliminar los contenedores detenidos. Estos son alias que uso para el mantenimiento de rutina

Si desea eliminar TODO su caché, primero debe asegurarse de que todos los contenedores estén detenidos y eliminados, ya que no puede eliminar una imagen en uso por un contenedor. Entonces algo similar

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

Esto eliminaría y eliminaría todas las imágenes en su caché.

Alexei Martianov
fuente
0

En la captura de pantalla de imágenes, el nombre "none" son imágenes colgantes. Una imagen colgante solo significa que ha creado la nueva construcción de la imagen, pero no se le ha dado un nuevo nombre. Entonces las viejas imágenes que tienes se convierten en la "imagen colgante". Esas imágenes antiguas son las que no están etiquetadas y muestran "" en su nombre cuando ejecuta imágenes acoplables.

docker system prune -a, eliminará las imágenes colgantes y no utilizadas. Por lo tanto, las imágenes que se usen en un contenedor, ya sea que se hayan salido o que se estén ejecutando actualmente, NO se verán afectadas.

Nirbhay Singh
fuente