Cómo eliminar imágenes de Docker antiguas y no utilizadas
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
.
(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 prune
eliminará todos los datos pendientes (contenedores, redes e imágenes). Puede eliminar todos los volúmenes no utilizados con la --volumes
opción y eliminar todas las imágenes no utilizadas (no solo las que cuelgan) con la -a
opció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 prune
con la --filter
opció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 dadalabel
(label=<key>
,label=<key>=<value>
,label!=<key>
, olabel!=<key>=<value>
): elimina únicamente contenedores, imágenes, redes y volúmenes con (o sin , en caso de quelabel!=...
se utilice) las etiquetas especificadas.
Consulte " Podar imágenes " para ver un ejemplo.
Advertencia: no hay ninguna --dry-run
opción de "vista previa" o " " para esos docker xxx prune
comandos.
Esto se solicita con moby/moby
el 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
containerd
snapshotter (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=true
filtro 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.
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, --force
opció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, --all
opció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
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 filter
opció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