¿Qué son las imágenes colgantes de Docker?
Las imágenes colgantes de Docker son capas sin etiquetar y sin usar que existen en el sistema de archivos de su host. Es posible que no se dé cuenta de su presencia y, por lo general, son basura no deseada.
En este artículo, aprenderá cómo surgen las imágenes colgantes y qué puede hacer para limpiarlas. Es una buena idea inspeccionar periódicamente cuántas imágenes pendientes tiene para evitar desperdiciar la capacidad de su disco.
¿Qué es una imagen colgante?
Una imagen colgante es simplemente una imagen sin usar que no tiene nombre ni etiqueta. Puede detectar fácilmente imágenes colgantes cuando ejecuta el docker images
comando porque aparecen como <none>:<none>
.
En este ejemplo, la primera imagen de la lista es una imagen colgante:
$ 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
La imagen no está etiquetada pero aún permanece en su sistema. En este caso, se consumen 55,3 MB de espacio en disco.
Puede verificar que la imagen está colgando y no solo sin usar verificando si algún contenedor hace referencia a ella:
$ 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
Ningún contenedor hace referencia a la <none>:<none>
imagen con identificación 509bc96b727d
así que definitivamente está colgando. Tenga en cuenta que las imágenes MySQL y Hello World no class como colgantes: a pesar de que los contenedores no los utilizan, están etiquetados correctamente, por lo que se supone que querrá conservarlos.
¿Cómo se crean las imágenes colgantes?
Las imágenes colgantes generalmente se crean cuando una imagen existente es reemplazada por una nueva compilación. Aquí hay un Dockerfile simple para demostrar lo que sucede:
FROM alpine:latest COPY demo.txt /demo.txt
Crea un archivo llamado demo.txt
en su directorio de trabajo y agregue algo de contenido:
$ echo 1 > demo.txt
Ahora construye tu imagen con docker build
:
$ docker build -t demo:latest .
ejecutar el docker images
Comando para ver tu nueva imagen:
REPOSITORY TAG IMAGE ID CREATED SIZE demo latest 40395b6c1362 24 seconds ago 5.54MB
Ahora modifique el contenido de demo.txt
y reconstruir su imagen:
$ echo 2 > demo.txt $ docker build -t demo:latest .
Se utiliza la misma etiqueta de imagen: demo:latest
- por lo que esta compilación reemplaza a la primera. Correr docker images
para ver el efecto:
REPOSITORY TAG IMAGE ID CREATED SIZE demo latest 3d5052e52b4c 3 seconds ago 5.54MB <none> <none> 40395b6c1362 59 seconds ago 5.54MB
La nueva imagen ha sido creada con ID 3d5052e52b4c
y el demo:latest
etiqueta. La primera imagen, DNI 40395b6c1362
, todavía existe pero no se ha etiquetado. Ahora se muestra como <none>:<none>
. Esta imagen se ha convertido en una imagen colgante ya que ningún contenedor la usa.
¿Puedes usar una imagen colgante?
Las imágenes colgantes funcionan como cualquier otra imagen. La única diferencia es la etiqueta que falta. Puede iniciar un contenedor a partir de una imagen colgante haciendo referencia directamente al ID de la imagen:
$ docker run -it 40395b6c1362 sh / #
Técnicamente, la imagen ya no cuelga, porque ahora un contenedor la usa activamente. Es común que los contenedores terminen con un none
imagen si elimina o reconstruye la etiqueta que usaron. Los contenedores con una imagen sin etiquetar mostrarán el ID de la imagen en el IMAGE
columna cuando corres docker ps
en lugar de la 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
Limpieza de imágenes colgantes
Puede eliminar una sola imagen colgante utilizando el docker rmi
comando, como cualquier otra imagen. Debido a que la imagen no se etiquetará, deberá identificarla por su ID.
$ docker rmi 40395b6c1362
Una mejor manera de limpiar muchas imágenes colgantes es la docker image prune
dominio. Esto eliminará automáticamente todas las imágenes colgantes en su host Docker.
$ docker image prune Total reclaimed space: 5.54 MB
La salida del comando muestra la cantidad de espacio en disco que se liberó. Compruebe si sus imágenes están realmente colgando si no se elimina nada. No es posible eliminar las imágenes utilizadas activamente por los contenedores. Deberá eliminar los contenedores con docker rm
primero, antes de intentar podar sus imágenes.
Podría encontrar que tiene una imagen pendiente que realmente desea reutilizar en el futuro. En esta situación, puede volver a etiquetarlo con el docker tag
dominio. Esto hará que la imagen sea más fácil de identificar y evitará que sea objeto de futuras operaciones de poda.
$ docker tag 40395b6c1362 demo:latest
Imágenes que se muestran como <none>:<none>
puede que no sean imágenes colgantes. De manera confusa, esta situación también ocurre para las imágenes creadas como capas intermedias durante una construcción.
Cada paso en un Dockerfile da como resultado la creación de una nueva capa intermedia. A la imagen producida al final de la compilación se le asigna la etiqueta que especifique. Las otras capas intermedias permanecen sin etiquetar y se pueden ver ejecutando docker images -a
.
Estas capas no son imágenes colgantes porque las imágenes posteriores en la cadena de construcción dependen de ellas. Son referenciados por cada capa sucesiva y no causan un problema de espacio en disco. Puede evitar que las capas intermedias se conserven en el disco al incluir el --rm
marca en el momento de la compilación:
$ docker build --rm -t demo:latest .
Resumen
Las imágenes colgantes son imágenes de Docker sin etiquetar que no usa un contenedor ni depende de un descendiente. Por lo general, no sirven para nada, pero aún consumen espacio en disco. Acumulará imágenes colgantes cuando reemplace una etiqueta existente al comenzar una nueva compilación.
Todas las imágenes colgantes se muestran como <none>:<none>
en la CLI de Docker. Tener demasiados de ellos puede ser abrumador cuando tienes docenas de imágenes sin información sobre su verdadera identidad. Corriendo regularmente docker images prune
evitará el desperdicio de espacio en disco y dará como resultado una lista de imágenes más corta.
Descubre más contenido