Cómo eliminar imágenes de Docker antiguas y no utilizadas

Resuelto Quanlong asked hace 8 años • 32 respuestas

Cuando se ejecuta Docker durante mucho tiempo, hay muchas imágenes en el sistema. ¿Cómo puedo eliminar todas las imágenes de Docker no utilizadas a la vez de forma segura para liberar almacenamiento?

Además, también quiero eliminar las imágenes extraídas hace meses que tengan el archivo TAG.

Por lo tanto, no estoy pidiendo que se eliminen únicamente las imágenes sin etiquetar. Estoy buscando una manera de eliminar imágenes generales no utilizadas, que incluyen imágenes sin etiquetar y otras imágenes, como las extraídas hace meses con el archivo correcto TAG.

Quanlong avatar Sep 23 '15 00:09 Quanlong
Aceptado

(ver más abajo para la respuesta original)


Actualización de septiembre de 2016 : Docker 1.13: PR 26108 y la confirmación 86de7c0 introducen algunos comandos nuevos para ayudar a facilitar la visualización de cuánto espacio ocupan los datos del demonio acoplable en el disco y permiten limpiar fácilmente el exceso "innecesario".

docker system pruneeliminará todos los datos pendientes (contenedores, redes e imágenes). Puede eliminar todos los volúmenes no utilizados con la --volumesopción y eliminar todas las imágenes no utilizadas (no solo las que cuelgan) con la -aopción.

Tu también tienes:

  • docker container prune
  • docker image prune
  • docker network prune
  • docker volume prune

Para imágenes no utilizadasdocker image prune -a , utilice (para eliminar imágenes colgantes y no utilizadas).
Advertencia: ' sin usar ' significa "imágenes a las que ningún contenedor hace referencia": tenga cuidado antes de usar -a.

Como se ilustra en la respuesta de AL , eliminará todas las imágenes no utilizadas , no solo las que cuelgan... lo que puede ser demasiado.docker system prune --all

Combinar docker xxx prunecon la --filteropción puede ser una excelente manera de limitar la poda ( docker SDK API 1.28 mínimo, por lo que Docker 17.04+ )

Los filtros admitidos actualmente son:

  • until (<timestamp>)- eliminar solo contenedores, imágenes y redes creadas antes de la marca de tiempo dada
  • label( label=<key>, label=<key>=<value>, label!=<key>, o label!=<key>=<value>): elimina únicamente contenedores, imágenes, redes y volúmenes con (o sin , en caso de que label!=...se utilice) las etiquetas especificadas.

Consulte " Podar imágenes " para ver un ejemplo.


Advertencia: no hay ninguna --dry-runopción de "vista previa" o " " para esos docker xxx prunecomandos.

Esto se solicita con moby/mobyel problema 30623 desde 2017, pero parece complicado de implementar (agosto de 2022).

Tener una visión más representativa de lo que se va a podar será bastante complicado, por varios motivos;

  • condiciones de carrera (se pueden resolver documentando las limitaciones);
    Es posible que un contenedor/imagen/volumen/red no esté en uso en el momento en que se utiliza el "ejecución en seco", pero puede estar en uso en el momento en que se ejecuta la poda real (o viceversa), por lo que la ejecución en seco siempre será una "aproximación" de lo que se podará.
  • La parte más difícil se debe a cómo los objetos (contenedores, imágenes, redes, etc.) dependen unos de otros .
    Por ejemplo, una imagen se puede eliminar si ya no tiene referencias a ella (no más etiquetas, no más contenedores que la utilicen); Esta es la razón por la que el sistema Docker elimina objetos en un orden específico (primero elimina todos los contenedores no utilizados, luego elimina las imágenes no utilizadas).
    Para replicar el mismo flujo para el "ejecución en seco", será necesario construir temporalmente una representación de todos los objetos y dónde se hace referencia a ellos en función de eso (básicamente; duplicar todos los contadores de referencias y luego eliminar las referencias de ese " representación de la sombra).
  • Finalmente; con el trabajo que se está realizando para integrar el containerdsnapshotter (almacenamiento de imágenes y capas) , las cosas pueden cambiar más;
    Por ejemplo, las imágenes ahora pueden tener múltiples arcos y (lo que se discutirá), la "poda" podría eliminar variantes (arquitecturas) no utilizadas de una imagen para limpiar espacio, lo que aporta otra dimensión al cálculo de "lo que se puede eliminar".

Respuesta original (septiembre de 2016)

Normalmente hago:

docker rmi $(docker images --filter "dangling=true" -q --no-trunc)

Tengo un [alias para eliminar esas imágenes colgantes : drmi] 13

El dangling=truefiltro encuentra imágenes no utilizadas.

De esa manera, se elimina cualquier imagen intermedia a la que ya no haga referencia una imagen etiquetada.

Hago lo mismo primero para los procesos salidos (contenedores)

alias drmae='docker rm $(docker ps -qa --no-trunc --filter "status=exited")'

Como señala haridsv en los comentarios :

Técnicamente, primero debes limpiar los contenedores antes de limpiar las imágenes, ya que esto capturará más imágenes colgantes y menos errores .


Jess Frazelle (jfrazelle) tiene la función bashrc :

dcleanup(){
    docker rm -v $(docker ps --filter status=exited -q 2>/dev/null) 2>/dev/null
    docker rmi $(docker images --filter dangling=true -q 2>/dev/null) 2>/dev/null
}

Para eliminar imágenes antiguas, y no sólo imágenes "colgante sin referencia", puede considerar docker-gc:


Un contenedor Docker simple y un script de recolección de basura de imágenes.

  • Se retiran los contenedores que salieron hace más de una hora.
  • Las imágenes que no pertenecen a ningún contenedor restante después de eso se eliminan.
VonC avatar Sep 22 '2015 17:09 VonC

Actualizar el segundo (2017-07-08)

Consulte (nuevamente) VonC, utilizando el aún más reciente system prune. Los impacientes pueden omitir el mensaje con la -f, --forceopción:

docker system prune -f

Los impacientes e imprudentes también pueden eliminar "imágenes no utilizadas, no sólo las que cuelgan" con la -a, --allopción:

docker system prune -af

https://docs.docker.com/engine/reference/commandline/system_prune/

Actualizar

Consulte la respuesta de VonCprune que utiliza los comandos agregados recientemente . Aquí está la conveniencia del alias de shell correspondiente:

alias docker-clean=' \
  docker container prune -f ; \
  docker image prune -f ; \
  docker network prune -f ; \
  docker volume prune -f '

Antigua respuesta

Eliminar contenedores detenidos (salidos):

$ docker ps --no-trunc -aqf "status=exited" | xargs docker rm

Eliminar imágenes no utilizadas (colgantes):

$ docker images --no-trunc -aqf "dangling=true" | xargs docker rmi

Si ha tenido extrema precaución con respecto a la pérdida irrevocable de datos , puede eliminar los volúmenes no utilizados (colgantes) (v1.9 y superiores):

$ docker volume ls -qf "dangling=true" | xargs docker volume rm

Aquí están en un práctico alias de shell:

alias docker-clean=' \
  docker ps --no-trunc -aqf "status=exited" | xargs docker rm ; \
  docker images --no-trunc -aqf "dangling=true" | xargs docker rmi ; \
  docker volume ls -qf "dangling=true" | xargs docker volume rm'

Referencias

  • docker ps -f
  • docker rm
  • docker images -f
  • docker rmi
  • Notas de la versión de Docker v1.9.0
  • docker volume ls
  • docker volume rm
therealneil avatar Jan 05 '2016 16:01 therealneil

Las otras respuestas son geniales, específicamente:

docker system prune # doesn't clean out old images
docker system prune --all # cleans out too much

Pero necesitaba algo en medio de los dos comandos así que la filteropción era lo que necesitaba:

docker image prune --all --filter "until=4320h" # delete images older than 6 months ago; 4320h = 24 hour/day * 30 days/month * 6 months

Como referencia: https://docs.docker.com/config/pruning/#prune-images

Zhao Li avatar May 18 '2018 07:05 Zhao Li