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


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'

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

Question

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

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

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




docker system prune -a

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




docker rm `docker ps -aq`

или

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



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

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

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

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




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

Просто беги:

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




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




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

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



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

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




Related



Tags

docker docker