imagenes - docker tag
¿Cómo puedo limpiar mi máquina host docker (6)
A medida que creo / depuro, una imagen acoplable / contenedor acoplable parece estar dejando todo tipo de artefactos en mi sistema. (en un momento dado había un límite de 48 imágenes) Pero la última vez que miré había 20-25 imágenes; docker images
.
Así que las preguntas generales son:
- ¿Cómo funciona una limpieza adecuada?
- A medida que estaba borrando manualmente las imágenes empezaron a llegar más. eh
- ¿Cuánto espacio en disco debería asignar realmente al host?
- ¿los demonios en ejecución realmente se reiniciarán después del siguiente reinicio?
y la meta pregunta ... ¿qué preguntas no he hecho que deban ser?
A veces no tienes estado, simplemente estará en blanco.
Aquí está mi versión:
docker rm -f $(docker ps -a | env -i grep -v Up | tail -n+2 | cut -d '' '' -f 1)
Aquí es cómo periódicamente purgo mi host docker:
Mata los contenedores que corren
docker kill $(docker ps -qa)
Eliminar todos los contenedores (y sus volúmenes asociados):
docker rm -v $(docker ps -qa)
Eliminar todas las imágenes:
docker rmi $(docker images -q)
Actualizar
Borre solo los contenedores que no se estén ejecutando. Analizar la salida "ps" para la cadena "Exited":
docker ps -a | awk ''/Exited/ {print $1}'' | xargs docker rm -v
No es perfecto ... No le pongas a tu contenedor el nombre "Salido" :-)
Actualizar
Docker 1.9 tiene un nuevo comando de volumen que se puede usar para purgar volúmenes antiguos
docker volume rm $(docker volume ls -qf dangling=true)
Actualizar
La última edición comunitaria de docker tiene un nuevo comando "podar sistema"
docker system prune --volumes
Esto purga las redes no utilizadas, elimina los contenedores detenidos, las imágenes colgantes y cualquier volumen no utilizado.
Estoy usando docker-machine con VirtualBox y después de eliminar todos los contenedores y todas las imágenes, la imagen de VirtualBox de la ventana acoplable todavía consume muchos gigabytes de espacio en disco.
Para limpiar también el espacio en el disco, ayuda a eliminar y volver a crear la máquina de conexión. P.ej:
docker-machine rm default
docker-machine create --driver virtualbox default
También me gustaría contribuir a esto con algunos comandos que se agregaron a la versión 1.13.0:
$ docker system prune
$ docker container prune
$ docker image prune
$ docker volume prune
$ docker network prune
ver registro de cambios: 1.13.0 (2017-01-18)
Agregue un nuevo comando del
docker system
con los subcomandosdf
y prune para la administración de recursos del sistema, así como los subcomandos deprune
docker {container,image,volume,network} prune
# 26108 # 27525 / # 27525
También puede ser útil eliminar imágenes "colgantes".
docker rmi $(docker images -f "dangling=true" -q)
Actualización: hay filtros incorporados en la ventana acoplable que le permiten mostrar correctamente los contenedores que cumplen ciertos criterios. Estas funciones de bash se toman de uno de los dotfiles de dotfiles de los mantenedores del núcleo:
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
}
del_stopped(){
local name=$1
local state=$(docker inspect --format "{{.State.Running}}" $name 2>/dev/null)
if [[ "$state" == "false" ]]; then
docker rm $name
fi
}
Respuesta original
Un script de ayuda que he creado para mi propio uso:
#!/bin/bash
# options:
# remove stopped containers and untagged images
# $ dkcleanup
# remove all stopped|running containers and untagged images
# $ dkcleanup --reset
# remove containers|images|tags matching {repository|image|repository/image|tag|image:tag}
# pattern and untagged images
# $ dkcleanup --purge {image}
# everything
# $ dkcleanup --nuclear
if [ "$1" == "--reset" ]; then
# Remove all containers regardless of state
docker rm -f $(docker ps -a -q) 2>/dev/null || echo "No more containers to remove."
elif [ "$1" == "--purge" ]; then
# Attempt to remove running containers that are using the images we''re trying to purge first.
(docker rm -f $(docker ps -a | grep "$2//|/$2 /| $2 /|:$2/|$2-/|$2:/|$2_" | awk ''{print $1}'') 2>/dev/null || echo "No containers using the /"$2/" image, continuing purge.") &&/
# Remove all images matching arg given after "--purge"
docker rmi $(docker images | grep "$2//|/$2 /| $2 /|$2 /|$2-/|$2_" | awk ''{print $3}'') 2>/dev/null || echo "No images matching /"$2/" to purge."
else
# This alternate only removes "stopped" containers
docker rm -f $(docker ps -a | grep "Exited" | awk ''{print $1}'') 2>/dev/null || echo "No stopped containers to remove."
fi
if [ "$1" == "--nuclear" ]; then
docker rm -f $(docker ps -a -q) 2>/dev/null || echo "No more containers to remove."
docker rmi $(docker images -q) 2>/dev/null || echo "No more images to remove."
else
# Always remove untagged images
docker rmi $(docker images | grep "<none>" | awk ''{print $3}'') 2>/dev/null || echo "No untagged images to delete."
fi
exit 0
A tus preguntas:
¿Cómo funciona una limpieza adecuada?
Aún no hay una forma oficial, solo scripts de ayuda y funciones como las anteriores.
A medida que estaba borrando manualmente las imágenes empezaron a llegar más. eh
es posible que haya estado eliminando imágenes que se crearon sobre otras que se "no etiquetaron" cuando intentó eliminarlas.
¿Cuánto espacio en disco debería asignar realmente al host?
Depende de los tipos de imágenes que planea usar. Sepa que la ejecución de una imagen de 500 mb varias veces no utiliza espacio (número de contenedores de 500 mb X). Los contenedores reutilizan la misma imagen y solo agregan lo que cambian cuando se ejecutan en la parte superior. Así que piense desde una perspectiva de almacenamiento de imagen, no un tiempo de ejecución de contenedor en relación con el almacenamiento.
¿los demonios en ejecución realmente se reiniciarán después del siguiente reinicio?
De forma predeterminada, se detienen cuando se reinicia el host. docker run --restart=True
ejecutarse con la docker run --restart=True
para que se reinicie automáticamente cuando se reinicie el host.