Как удалить старые и неиспользуемые изображения 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
Как удалить помеченное изображение
(это работает в ноябре 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
- принудительное удаление.