2015-09-22 6 views
365

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

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

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

ответ

787

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

docker system prune удалит ВСЕ ОБНАРУЖЕННЫЕ данные (т. Е. В порядке: контейнеры остановлены, тома без контейнеров и изображений без контейнеров). Даже неиспользуемые данные, с опцией -a.

Вы также:

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


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

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

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

Я не имеют alias for removing those [dangling images]8: drmi

The dangling=true filter finds unused images

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

я сделать то же самое первого для exited processes (containers)

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

Как haridsv баллов из in the comments:

Technically, you should first clean up containers before cleaning up images, as this will catch more dangling images and less errors.


Jess Frazelle (jfrazelle) имеет bashrc function:

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:


A simple Docker container and image garbage collection script.

  • Containers that exited more than an hour ago are removed.
  • Images that don't belong to any remaining container after that are removed.
+13

Есть ли документация о том, что '' dangling = true ''на самом деле означает? – CivFan

+1

Этот сценарий не может удалить некоторые изображения, вытащенные месяцы назад – Quanlong

+0

@Quanlong Я отредактировал ответ и ссылался на проект, который удаляет старые изображения. – VonC

1

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

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

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

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 
+1

Неверное изображение. Это удаляет изображения * созданные * 3 месяца назад, а не изображения * вытащили * 3 месяца назад (если вы вытащите их из удаленного источника, им уже может быть 3 месяца назад). –

+0

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

3
docker rm `docker ps -aq` 

или

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

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

64

Update второй (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/

Обновление:

Re fer до VonC's 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 

Если вы воспользовались extreme cau Тион с учетом безвозвратной потери данных, то вы можете удалить неиспользуемые (свисающие) томов (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' 

Ссылки:

+2

Я проявляю осторожность при очистке объема. Оба автоматически созданных тома контейнера и именованные тома, которые в настоящее время не используются, перечислены вместе с dangling = true. – BMitch

+1

@BMitch, вы абсолютно правы; Я добавил строгий сигнал к рецепту 'docker volume rm'. Я буду приветствовать любые ваши предложения. – rubicks

+1

Мне бы понравился докер, чтобы дать нам другую опцию фильтра для названных томов. Если я придумаю хороший обходной путь, я обязательно поделюсь. – BMitch

38

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

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

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

+1 Для команды удаления старых изображений докеров. Это немного взломанно, но решение оригинально и отлично работает :) – Rick

+1

Это приятно, но я думаю, что это удаляет только изображения докеров, которые не менее ** 4 месяца ** старые. '.CreatedSince' использует недели как единицу времени на выходе даже на изображениях, которым много недель, например. '12 недель'. – joelittlejohn

+1

Это сработало для меня, приятно и просто: 'docker images | grep 'months' | awk '{print $ 3}' | xargs --no-run-if-empty docker rmi -f' –

7

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

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

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

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

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

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

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

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

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

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

Оригинал Post - http://www.scmtechblog.net/2016/06/clean-up-docker-images-from-local-to.html

+0

Ницца, это выглядит довольно полным.+1 – VonC

1

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

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

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

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

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

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

  1. Начало Docker: systemctl начать Docker

  2. Сохраните все изображения: докер сэкономить $ (Докер изображения | СЭД -e '/ ^/d' -e '/^СКЛАД/г' -e 's, [] [] ,:,' -e 's, [] ,,.')> /root/docker.img

  3. Uninstall грузчиком.

  4. Стереть все в/вар/Lib/грузчиком: гт -rf/вар/Библиотека/грузчик/[cdintv] *

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

  6. Включить докер: systemctl включить Docker

  7. Начало докер: systemctl начать докер

  8. Восстановление изображений: докер нагрузки </корень/документ ker.img

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

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

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

2

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

  1. Docker RMI тег первый

  2. докер RMI изображение.

    #, что может быть сделано в один докер RMI вызова, например: # докер RMI < репо: тег> < ImageID>

(это работает Nov 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 

e.g. Сценарий удаляет все, что старше двух недель.

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 
1

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

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

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

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

15

Если у вас есть 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.

+3

Вы не хотите обрезать неиспользуемые сети? например, если все контейнеры остановлены, и я удалю эти сети, как они будут работать в контейнерах, если я их запустил. Создаются ли сети вместе с запуском докеров? – meffect

+0

@meffect Я полностью согласен и бог, что я покинул сеть. Я включил это и добавил часть в конце, заявив, что я бы не рекомендовал использовать «docker system prune», а отдельный чернослив. – Programster

+0

О, ладно. я отвечаю, я все еще изучаю докер. Ty – meffect

4

До сих пор (докерная версия 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 
2

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

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 недели назад.

0

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

Просто запустите:

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 

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

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

2

docker system prune -a

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

+0

** Это опасно **, см. Другие комментарии о 'docker system prune' удалении даже названных томов с' -a'. – RichVel

Смежные вопросы