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





image list (17)


Обновление: сентябрь 2016 года: Docker 1.13: PR 26108 и commit 86de7c0 представляют несколько новых команд, которые помогают облегчить визуализацию того, сколько места данные демона-докеры берут на диск и позволят легко очистить избыток «ненужных».

docker system prune удалит ВСЕ болтающиеся данные (т. е. в порядке: контейнеры остановлены, тома без контейнеров и изображений без контейнеров). Даже неиспользуемые данные с опцией -a .

У вас также есть:

Для неиспользуемых изображений используйте docker image prune -a (для удаления оборванных и неэкранных изображений).
Предупреждение: « неиспользуемый » означает «изображения, на которые не ссылается какой-либо контейнер»: будьте осторожны перед использованием -a .

Как проиллюстрировано в answer AL , docker system prune --all удалит все неиспользуемые изображения, а не только болтающиеся ... что может быть слишком много.

Комбинация docker xxx prune с --filter параметром --filter может стать отличным способом ограничить обрезку ( докеры SDK API 1.28 минимум, поэтому докер 17.04+ )

В настоящее время поддерживаются следующие фильтры:

  • until (<timestamp>) - удалите только контейнеры, изображения и сети, созданные до заданной отметки времени
  • label ( label=<key> , label=<key>=<value> , label!=<key> или label!=<key>=<value> )) - удалять контейнеры, изображения, сети и тома только с помощью ( или без , в случае, если используется label!=... ) указанные метки.

См. Пример « Обрезать изображения ».

Оригинальный ответ (сентябрь 2016 г.)

Обычно я делаю:

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

У меня есть псевдоним для удаления этих [оборванных изображений] 13 : drmi

Фильтр dangling=true находит неиспользуемые изображения

Таким образом, любое промежуточное изображение, которое больше не ссылается на помеченное изображение, удаляется.

Я делаю то же самое сначала для завершенных процессов (контейнеров)

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

Как отмечает haridsv в комментариях :

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

Jess Frazelle (jfrazelle) имеет функцию 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
}

Чтобы удалить старые изображения, а не только «изображения без ссылок», вы можете рассмотреть docker-gc :

Простой контейнер Docker и графический сборщик мусора.

  • Контейнеры, которые вышли более часа назад, удаляются.
  • Изображения, которые не принадлежат ни одному оставшемуся контейнеру, после этого удаляются.

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

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

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




Вот сценарий для очистки изображений Docker и восстановления пространства.

#!/bin/bash -x
## Removing stopped container
docker ps -a | grep Exited | awk '{print $1}' | xargs docker rm

## If you do not want to remove all container you can have filter for days and weeks old like below
#docker ps -a | grep Exited | grep "days ago" | awk '{print $1}' | xargs docker rm
#docker ps -a | grep Exited | grep "weeks ago" | awk '{print $1}' | xargs docker rm

## Removing Dangling images
## There are the layers images which are being created during building a Docker image. This is a great way to recover the spaces used by old and unused layers.

docker rmi $(docker images -f "dangling=true" -q)

## Removing images of perticular pattern For example
## Here I am removing images which has a SNAPSHOT with it.

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

## Removing weeks old images

docker images | grep "weeks ago" | awk '{print $3}' | xargs docker rmi

## Similarly you can remove days, months old images too.

Оригинальный сценарий

https://github.com/vishalvsh1/docker-image-cleanup

Обычно Docker хранит все временные файлы, связанные с построением изображений и

/ Var / Библиотека / Докер

Этот путь является локальным для системы, обычно в корневом разделе «/» .

Вы можете монтировать большее дисковое пространство и перемещать содержимое /var/lib/docker в новое место монтирования и создавать символическую ссылку.

Таким образом, даже если изображения Docker занимают пространство, это не повлияет на вашу систему, так как будет использоваться другое место монтирования.

Оригинальное сообщение: Управление изображениями Docker на локальном диске




Обновить второй (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'

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




@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



Предполагая, что у вас есть 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 .




Недавно я написал сценарий для решения этой проблемы на одном из моих серверов:

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



docker system prune -a

(Вам будет предложено подтвердить команду. Используйте -f для принудительного запуска, если вы знаете, что делаете.)




docker rm `docker ps -aq`

или же

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



Если вы хотите автоматически / периодически очищать выведенные контейнеры и удалять изображения и тома, которые не используются в запущенном контейнере, вы можете загрузить изображение 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 rm $(docker ps -a | grep "weeks" | awk '{ print $1; }')

Удалите старые изображения несколько недель назад. Быть осторожен. Это приведет к удалению базовых изображений, которые были созданы несколько недель назад, но которые могут использовать ваши новые изображения.

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




Если вы хотите удалить изображения, снятые 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



До сих пор (версия 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



Иногда я сталкивался с проблемами, когда Docker будет выделять и продолжать использовать дисковое пространство, даже если пространство не выделено ни одному конкретному изображению или существующему контейнеру. Последний способ, которым я создал эту проблему, случайно использовал «сборщик док-двигателей» centos вместо «докеров» в RHEL 7.1. Похоже, что иногда очистка контейнеров не завершается успешно, а затем пространство никогда не используется повторно. Когда диск 80GB, который я выделил как /, был заполнен файлами / var / lib / docker, мне пришлось придумать творческий способ решить проблему.

Вот что я придумал. Сначала для устранения полной ошибки диска:

  1. Остановить докер: systemctl stop docker
  2. Выделил новый диск, установленный как say / mnt / docker.
  3. Переместите все файлы в / var / lib / docker в / mnt / docker. Я использовал команду: rsync -aPHSx --remove-source-files / var / lib / docker / / mnt / docker /
  4. Установите новый диск в / var / lib / docker.

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

  1. Запустить Docker: начать работу с док-станцией systemctl

  2. Сохраните все изображения: docker save $ (docker images | sed -e '/ ^ / d' -e '/ ^ REPOSITORY / d' -e 's, [] [] ,:,' -e 's, [ ]. ,, ')> /root/docker.img

  3. Удалите докеры.

  4. Стереть все в / var / lib / docker: rm -rf / var / lib / docker / [cdintv] *

  5. Переустановите докер

  6. Включить docker: включить systemctl docker

  7. Начать докер: systemctl start docker

  8. Восстановить изображения: загрузка докеров </root/docker.img

  9. Запустите любые постоянные контейнеры, которые нужно запустить.

Это снизило использование моего диска с 67 ГБ для докеров до 6 ГБ для докеров.

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




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

$ sparrow plg run docker-remove-dangling-images

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




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

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

Обратите внимание, что он не сможет удалить изображения, которые используются контейнером, на которые ссылаются в репозитории, имеет зависимые дочерние изображения ... это, вероятно, то, что вы хотите. Else просто добавьте флаг -f .

Пример сценария /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



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

  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



docker rm --force `docker ps -qa`




docker