imagen - Cómo eliminar imágenes de Docker antiguas y sin usar




hub tag (17)

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, por lo que la opción de filter 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

Espero que ayude :)

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

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 para liberar el almacenamiento?

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

Por lo tanto, no estoy pidiendo la eliminación de imágenes sin etiquetar solamente. Estoy buscando una forma de eliminar las imágenes no utilizadas en general, que incluye imágenes sin etiquetar y otras, como las que se sacaron hace meses con el TAG correcto.


docker rm `docker ps -aq`

o

docker rm $(docker ps -q -f status=exited)

Retire los contenedores viejos hace semanas.

docker rm $(docker ps -a | grep "weeks" | awk '{ print $1; }')

Eliminar imágenes antiguas hace semanas. Ten cuidado. Esto eliminará las imágenes base que se crearon hace semanas, pero que sus nuevas imágenes podrían estar usando.

docker rmi $(docker images | grep 'weeks' | awk '{ print $3; }')


Si desea limpiar automáticamente / periódicamente los contenedores salidos y eliminar las imágenes y los volúmenes que no están siendo utilizados por un contenedor en ejecución, puede descargar la imagen de meltwater/docker-cleanup la meltwater/docker-cleanup .

Solo corre:

docker run -d -v /var/run/docker.sock:/var/run/docker.sock:rw  -v /var/lib/docker:/var/lib/docker:rw --restart=unless-stopped meltwater/docker-cleanup:latest

Se ejecuta cada 30 minutos por defecto. Sin embargo, puede establecer el tiempo de demora usando este indicador en segundos (opción DELAY_TIME = 1800).

Más detalles: https://github.com/meltwater/docker-cleanup/blob/master/README.md


Cómo eliminar una imagen etiquetada

  1. docker rmi la etiqueta primero

  2. docker rmi la imagen.

    # que se puede hacer en una llamada rmi docker, por ejemplo: # docker rmi <repo: tag> <imageid>

(esto funciona en noviembre de 2016, versión 1.12.2 de Docker)

p.ej

$ docker images 
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
usrxx/the-application   16112805            011fd5bf45a2        12 hours ago        5.753 GB
usryy/the-application   vx.xx.xx            5af809583b9c        3 days ago          5.743 GB
usrzz/the-application   vx.xx.xx            eef00ce9b81f        10 days ago         5.747 GB
usrAA/the-application   vx.xx.xx            422ba91c71bb        3 weeks ago         5.722 GB
usrBB/the-application   v1.00.18            a877aec95006        3 months ago        5.589 GB

$ docker rmi usrxx/the-application:16112805 && docker rmi 011fd5bf45a2
$ docker rmi usryy/the-application:vx.xx.xx && docker rmi 5af809583b9c
$ docker rmi usrzz/the-application:vx.xx.xx eef00ce9b81f
$ docker rmi usrAA/the-application:vx.xx.xx 422ba91c71bb
$ docker rmi usrBB/the-application:v1.00.18 a877aec95006

Por ejemplo, Scripted remueve cualquier cosa mayor a 2 semanas.

IMAGESINFO=$(docker images --no-trunc --format '{{.ID}} {{.Repository}} {{.Tag}} {{.CreatedSince}}' |grep -E " (weeks|months|years)")
TAGS=$(echo "$IMAGESINFO" | awk '{ print $2 ":" $3 }' )
IDS=$(echo "$IMAGESINFO" | awk '{ print $1 }' )
echo remove old images TAGS=$TAGS IDS=$IDS
for t in $TAGS; do docker rmi $t; done
for i in $IDS; do docker rmi $i; done

Suponiendo que tenga Docker 1.13 o superior, solo puede usar los comandos de podar. Para su pregunta específicamente para eliminar imágenes antiguas, desea la primera.

# Remove unused images
docker image prune

# Remove stopped containers.
docker container prune

# Remove unused volumes
docker volume prune

# Remove unused networks
docker network prune

# Command to run all prunes:
docker system prune

Recomendaría no acostumbrarse a usar el comando de docker system prune . Calculo que los usuarios eliminarán accidentalmente las cosas que no quieren. Personalmente, voy a utilizar principalmente los comandos docker container prune docker image prune docker container prune y docker container prune .


Para eliminar las imágenes etiquetadas que no tienen contenedor en ejecución, tendrá que usar un pequeño script:

#!/bin/bash

# remove not running containers
docker rm $(docker ps -f "status=exited" -q)

declare -A used_images

# collect images which has running container
for image in $(docker ps | awk 'NR>1 {print $2;}'); do
    id=$(docker inspect --format="{{.Id}}" $image);
    used_images[$id]=$image;
done

# loop over images, delete those without a container
for id in $(docker images --no-trunc -q); do
    if [ -z ${used_images[$id]} ]; then
        echo "images is NOT in use: $id"
        docker rmi $id
    else
        echo "images is in use:     ${used_images[$id]}"
    fi
done

Estoy usando este comando:

export BEFORE_DATETIME=$(date --date='10 weeks ago' +"%Y-%m-%dT%H:%M:%S.%NZ")
docker images -q | while read IMAGE_ID; do
    export IMAGE_CTIME=$(docker inspect --format='{{.Created}}' --type=image ${IMAGE_ID})
    if [[ "${BEFORE_DATETIME}" > "${IMAGE_CTIME}" ]]; then
        echo "Removing ${IMAGE_ID}, ${BEFORE_DATETIME} is earlier then ${IMAGE_CTIME}"
        docker rmi -f ${IMAGE_ID};
    fi;
done

Esto eliminará todas las imágenes cuyo tiempo de creación sea superior a 10 semanas atrás.


Si desea eliminar las imágenes extraídas hace X meses, puede probar el siguiente ejemplo que elimina las imágenes creadas hace tres meses:

three_months_old_images=`docker images | grep -vi "<none>" | tr -s ' ' | cut -d" " -f3,4,5,6 | grep "3 months ago" | cut -d" " -f1`
docker rmi $three_months_old_images

Ocasionalmente me he encontrado con problemas en los que Docker asignará y continuará usando el espacio en disco, incluso cuando el espacio no esté asignado a ninguna imagen en particular o contenedor existente. La última forma en la que generé este problema accidentalmente fue utilizando centos de "docker-engine" en lugar de "docker" en RHEL 7.1. Lo que parece suceder es que a veces las limpiezas del contenedor no se completan con éxito y el espacio nunca se reutiliza. Cuando la unidad de 80 GB asigné como / estaba llena de archivos / var / lib / docker, tuve que encontrar una forma creativa para resolver el problema.

Aquí es lo que se me ocurrió. Primero en resolver el error completo del disco:

  1. Stop docker: systemctl stop docker
  2. Asignó un nuevo disco montado como, por ejemplo, / mnt / docker.
  3. Mueva todos los archivos en / var / lib / docker a / mnt / docker. Utilicé el comando: rsync -aPHSx --remove-source-files / var / lib / docker / / mnt / docker /
  4. Monte el nuevo disco en / var / lib / docker.

En este punto ya no tenía un error de disco completo, pero aún estaba perdiendo una gran cantidad de espacio. Los próximos pasos son cuidar de eso.

  1. Iniciar Docker: systemctl start docker

  2. Guarde todas las imágenes: la ventana acoplable ahorra $ (imágenes de la ventana acoplable | sed -e '/ ^ / d' -e '/ ^ REPOSITORY / d' -e 's, [] [] ,:,' -e 's, [ ]. ,, ')> /root/docker.img

  3. Desinstalar ventana acoplable.

  4. Borre todo en / var / lib / docker: rm -rf / var / lib / docker / [cdintv] *

  5. Reinstalar la ventana acoplable

  6. Activar ventana acoplable: systemctl habilitar ventana acoplable

  7. Iniciar ventana acoplable: systemctl iniciar ventana acoplable

  8. Restaurar imágenes: carga de la ventana acoplable </root/docker.img

  9. Inicie cualquier contenedor persistente que necesite correr.

Esto redujo el uso del disco de 67 GB para la ventana acoplable a 6 GB para la ventana acoplable.

No lo recomiendo para uso diario. Pero es útil para ejecutar cuando parece que la ventana acoplable ha perdido la pista del espacio en disco utilizado debido a errores de software o reinicios inesperados.


docker system prune -a

(Se te pedirá que confirmes el comando. Usa -f para forzar la ejecución, si sabes lo que estás haciendo).



Recientemente escribí un script para resolver esto en uno de mis servidores:

#!/bin/bash

# Remove all the dangling images
DANGLING_IMAGES=$(docker images -qf "dangling=true")
if [[ -n $DANGLING_IMAGES ]]; then
    docker rmi "$DANGLING_IMAGES"
fi

# Get all the images currently in use
USED_IMAGES=($( \
    docker ps -a --format '{{.Image}}' | \
    sort -u | \
    uniq | \
    awk -F ':' '$2{print $1":"$2}!$2{print $1":latest"}' \
))

# Get all the images currently available
ALL_IMAGES=($( \
    docker images --format '{{.Repository}}:{{.Tag}}' | \
    sort -u \
))

# Remove the unused images
for i in "${ALL_IMAGES[@]}"; do
    UNUSED=true
    for j in "${USED_IMAGES[@]}"; do
        if [[ "$i" == "$j" ]]; then
            UNUSED=false
        fi
    done
    if [[ "$UNUSED" == true ]]; then
        docker rmi "$i"
    fi
done

Para eliminar las imágenes etiquetadas antiguas que tienen más de un mes de antigüedad:

$ docker images --no-trunc --format '{{.ID}} {{.CreatedSince}}' \
    | grep ' months' | awk '{ print $1 }' \
    | xargs --no-run-if-empty docker rmi

Tenga en cuenta que no podrá eliminar las imágenes que utiliza un contenedor, a las que se hace referencia en un repositorio, tiene imágenes secundarias dependientes ... que es probablemente lo que desea. Si no, simplemente añada la bandera -f .

Ejemplo de script /etc/cron.daily/docker-gc :

#!/bin/sh -e

# Delete all stopped containers (including data-only containers).
docker ps -a -q --no-trunc --filter "status=exited" | xargs --no-run-if-empty docker rm -v

# Delete all tagged images more than a month old
# (will fail to remove images still used).
docker images --no-trunc --format '{{.ID}} {{.CreatedSince}}' | grep ' months' | awk '{ print $1 }' | xargs --no-run-if-empty docker rmi || true

# Delete all 'untagged/dangling' (<none>) images
# Those are used for Docker caching mechanism.
docker images -q --no-trunc --filter dangling=true | xargs --no-run-if-empty docker rmi

# Delete all dangling volumes.
docker volume ls -qf dangling=true | xargs --no-run-if-empty docker volume rm

@VonC ya dio una muy buena respuesta, pero para completar, aquí hay un pequeño script que he estado utilizando --- y que también afecta a cualquier proceso de recado de Docker si tuviera algo:

#!/bin/bash

imgs=$(docker images | awk '/<none>/ { print $3 }')
if [ "${imgs}" != "" ]; then
   echo docker rmi ${imgs}
   docker rmi ${imgs}
else
   echo "No images to remove"
fi

procs=$(docker ps -a -q --no-trunc)
if [ "${procs}" != "" ]; then
   echo docker rm ${procs}
   docker rm ${procs}
else
   echo "No processes to purge"
fi

Esto funcionó para mí:

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

tar y docker cp son una buena combinación para copiar todo en un directorio.

Crear un contenedor de volumen de datos

docker create --name dvc --volume /path/on/container cirros

Para preservar la jerarquía de directorios

tar -c -C /path/on/local/machine . | docker cp - dvc:/path/on/container

Revisa tu trabajo

docker run --rm --volumes-from dvc cirros ls -al /path/on/container




docker