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

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

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

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

Ответ 1

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

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

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

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

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

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

Поддерживаемые в настоящее время фильтры:

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

См. "Обрезать изображения" для примера.


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

Я обычно делаю:

  docker rmi $(файлы докеров - фильтр "dangling = true" -q -no-trunc)
Код>

У меня есть псевдоним для удаления этих [ оборванные изображения] 13: ИУРБкод>

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

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

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

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

Как haridsv указывает в комментариях:

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


Джесс Фразель (jfrazelle)имеет функцию bashrc:

<Предварительно > <код > dcleanup() {   docker rm -v $(docker ps - статус фильтра = exited -q 2 > /dev/null) 2 > /dev/null   docker rmi $(файлы докеров - фильтр dangling = true -q 2 > /dev/null) 2 > /dev/null } Код >

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


Простая сборка контейнера Docker и сборщик изображений script.

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

Ответ 2

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

Update:

Обратитесь к VonC answer, который использует недавно добавленные команды 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'

Литература:

Ответ 3

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

$ 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 script:

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

Ответ 4

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

# 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 container prune.

Ответ 5

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

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

Ответ 6

Это сработало для меня:

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

Вот скрипт для очистки образов 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/Library/Докер

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

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

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

Исходное сообщение: Управление образами Docker на локальном диске.

Ответ 10

Я использую эту команду:

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

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

Ответ 11

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

Ответ 12

Для удаления всех изображений и томов, а также
docker system prune -af --volumes

Ответ 13

@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

Ответ 14

Чтобы удалить теги с тегами, которые не запущены в контейнере, вам нужно будет использовать немного 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

Ответ 15

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

  • docker rmi тег первый

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

    #, который можно выполнить в одном докере rmi call, например: # 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

Ответ 16

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

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

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

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

Ответ 17

docker system prune -a

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

Ответ 18

docker rm $(docker ps -faq)
docker rmi $(docker ps -faq)

-f сила

-a все

-q в режиме

Ответ 19

docker rm `docker ps -aq`

или

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

Ответ 20

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

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

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

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

  • Запустите Docker: systemctl start docker

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

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

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

  • Переустановите docker

  • Включить докер: systemctl enable docker

  • Запустите докер: systemctl start docker

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

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

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

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

Ответ 21

Если вы хотите автоматически/периодически очищать покинутые контейнеры и удалять изображения и тома, которые не используются запущенным контейнером, вы можете загрузить образ 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

Ответ 22

Следующая команда удалит изображения старше 48 часов.

$docker image prune --all --filter until=48h

Ответ 23

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

$ sparrow plg run docker-remove-dangling-images

Работает как для Linux, так и для Windows.

Ответ 24

Сначала запустите docker images чтобы увидеть список изображений, и скопируйте ИД ИЗОБРАЖЕНИЯ в буфер обмена.

Запустите docker rmi -f <Image>

Помните, опция -f - принудительное удаление.