delete image - Как удалить старые и неиспользуемые изображения Docker




10 Answers

Обновить второй (2017-07-08):

Обратитесь (еще раз) к VonC, используя еще более свежие system prune . У нетерпения может пропустить подсказку с параметром -f, --force :

docker system prune -f

Нетерпеливые и безрассудные могут дополнительно удалить «неиспользуемые изображения не только болтающихся» с помощью опции -a, --all :

docker system prune -af

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

Обновить:

См . Ответ VonC, в котором используются недавно добавленные команды prune . Ниже приведено соответствующее свойство псевдонимов оболочки:

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

Старый ответ:

Удалить остановленные (выведенные) контейнеры:

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

Удалить неиспользуемые (оборванные) изображения:

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

Если вы проявляете особую осторожность в отношении безотзывной потери данных , вы можете удалить неиспользуемые (оборванные) тома (v1.9 и выше):

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

Здесь они находятся в удобном псевдониме оболочки:

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'

Рекомендации:

list containers run

При работе Docker в течение долгого времени в системе много изображений. Как я могу удалить все неиспользуемые изображения Докера одновременно, чтобы освободить хранилище?

Кроме того, я также хочу удалить изображения, снятые несколько месяцев назад, которые имеют правильную TAG .

Поэтому я не прошу только удалить немаркированные изображения. Я ищу способ удалить общие неиспользуемые изображения, которые включают как немаркированные, так и другие изображения, такие как потянутые месяцы назад с правильной TAG .




Предполагая, что у вас есть Docker 1.13 или выше, вы можете просто использовать команды prune. Для вашего вопроса специально для удаления старых изображений вам нужен первый.

# 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

Я бы порекомендовал вам не привыкнуть к использованию команды docker system prune . Я считаю, что пользователи случайно удалят то, что они не хотят. Лично я собираюсь в основном использовать команды docker image prune и docker container prune .




Другие ответы велики, в частности:

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

Но мне нужно было что-то посреди двух команд, поэтому опция filter была тем, что мне нужно:

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

Надеюсь, это поможет :)

Для справки: https://docs.docker.com/config/pruning/#prune-images




До сих пор (версия Docker 1.12) мы используем следующую команду для удаления всех запущенных контейнеров. Кроме того, если мы хотим удалить тома, мы можем сделать это вручную, используя соответствующий тег -v в следующей команде.

Удалить все выходящие контейнеры

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

Удалить все остановленные контейнеры

docker rm $(docker ps -a -q)

Удалить все запущенные и остановленные контейнеры

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

Удалите все контейнеры без каких-либо критериев.

docker container rm $(docker container ps -aq)

Но в версии 1.13 и выше, для полной системы и очистки, мы можем непосредственно пользователь выполнить следующую команду:

docker system prune

Все неиспользуемые контейнеры, изображения, сети и тома будут удалены. Мы также можем сделать это, используя следующие команды, которые очищают отдельные компоненты:

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



Если вы хотите удалить изображения, снятые X месяцев назад, вы можете попробовать пример ниже, который удаляет изображения, созданные три месяца назад:

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



Чтобы удалить теги с тегами, которые не работают в контейнере, вам нужно будет использовать небольшой скрипт:

#!/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



Как удалить помеченное изображение

  1. docker rmi тег первый

  2. docker rmi изображение.

    #, который может быть выполнен в одном вызове rock docker, например: # docker rmi <repo: tag> <imageid>

(это работает в ноябре 2016 года, версия Docker 1.12.2)

например

$ 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

например, сценарий удаляет что-либо старше 2 недель.

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



@VonC уже дал очень хороший ответ, но для полноты здесь есть маленький скрипт, который я использовал --- и который также уничтожает любые процессы Docker по поручению, если у вас есть:

#!/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



Если вы хотите автоматически / периодически очищать выведенные контейнеры и удалять изображения и тома, которые не используются в запущенном контейнере, вы можете загрузить изображение meltwater/docker-cleanup .

Просто беги:

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

Он работает каждые 30 минут по умолчанию. Однако вы можете установить время задержки, используя этот флаг в секундах (опция DELAY_TIME = 1800).

Подробнее: https://github.com/meltwater/docker-cleanup/blob/master/README.md




Есть docker-remove-dangling-images плагины- docker-remove-dangling-images плагины docker-remove-dangling-images вы можете использовать для очистки остановленных контейнеров и неиспользуемых (оборванных) изображений:

$ sparrow plg run docker-remove-dangling-images

Он работает как для Linux, так и для ОС Windows.




Related


Tags

docker