developer tip

오래되고 사용되지 않는 Docker 이미지를 제거하는 방법

copycodes 2020. 9. 30. 11:03
반응형

오래되고 사용되지 않는 Docker 이미지를 제거하는 방법


Docker를 오랫동안 실행하면 시스템에 많은 이미지가 있습니다. 사용하지 않는 모든 Docker 이미지를 한 번에 안전하게 제거하여 스토리지를 확보하려면 어떻게해야합니까?

또한 몇 달 전에 가져온 이미지를 제거하고 싶습니다 TAG.

따라서 태그가없는 이미지 만 제거하도록 요청하는 것이 아닙니다. 태그가 지정되지 않은 이미지와 몇 달 전에 올바로 가져온 다른 이미지를 모두 포함하는 일반적인 사용하지 않는 이미지를 제거하는 방법을 찾고 TAG있습니다.


2016 년 9 월 업데이트 : Docker 1.13 : PR 26108커밋 86de7c0 은 docker 데몬 데이터가 디스크에서 차지하는 공간을 시각화하고 "불필요한"초과분을 쉽게 정리할 수 있도록 도와주는 몇 가지 새로운 명령을 도입했습니다.

docker system prune매달린 모든 데이터를 삭제합니다 (예 : 컨테이너가 중지됨, 컨테이너가없는 볼륨 및 컨테이너가없는 이미지). 사용하지 않는 데이터도 -a옵션 으로 제공됩니다.

또한 :

을 위해 사용되지 않은 이미지 사용 docker image prune -a(매다는 제거 ununsed 이미지).
경고 : ' 사용하지 않음 '은 '컨테이너에서 참조하지 않는 이미지'를 의미 -a합니다. 사용하기 전에주의하세요 .

에 도시 된 바와 같이, AL대답 , docker system prune --all모두 제거 되지 않은 단지 조금 너무 많이가 될 수 있습니다 사람을 ... 매달려없는 이미지를.

옵션docker xxx prune결합 하면 가지 치기를 제한하는 좋은 방법이 될 수 있습니다 ( docker SDK API 1.28 최소, 따라서 docker 17.04+ )--filter

현재 지원되는 필터는 다음과 같습니다.

  • until (<timestamp>) -주어진 타임 스탬프 이전에 생성 된 컨테이너, 이미지 및 네트워크 만 제거
  • label( label=<key>, label=<key>=<value>, label!=<key>, 또는 label!=<key>=<value>) - 만 (또는 용기와, 화상, 네트워크, 볼륨을 제거 하지 않고 경우에 label!=...사용된다) 지정된 라벨.

예는 " 이미지 정리 "를 참조하십시오 .


원문 답변 (2016 년 9 월)

나는 보통 :

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 컨테이너 및 이미지 가비지 수집 스크립트.

  • 1 시간 이상 전에 종료 된 컨테이너는 제거됩니다.
  • 나머지 컨테이너에 속하지 않는 이미지는 제거됩니다.

두 번째 업데이트 (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'

참조 :


한 달 이상 된 오래된 태그 이미지 를 제거하려면 :

$ 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

다른 답변은 특히 훌륭합니다.

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


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 prunedocker container prune명령을 사용 합니다.


이것은 나를 위해 일했습니다.

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

지금까지 (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

최근에 내 서버 중 하나에서이 문제를 해결하는 스크립트를 작성했습니다.

#!/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 이미지를 정리하고 공간을 확보하는 스크립트입니다.

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

이 경로는 일반적으로 루트 파티션 "/" 에있는 시스템의 로컬 경로입니다 .

더 큰 디스크 공간을 마운트하고의 내용을 /var/lib/docker새 마운트 위치 로 이동하고 심볼릭 링크를 만들 수 있습니다.

이렇게하면 Docker 이미지가 공간을 차지하더라도 다른 마운트 위치를 사용하므로 시스템에 영향을주지 않습니다.

원본 게시물 : 로컬 디스크에서 Docker 이미지 관리


이 명령을 사용하고 있습니다.

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 주 이상인 모든 이미지가 제거됩니다.


X 개월 전에 가져온 이미지를 제거 하려면 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

모든 이미지와 볼륨도 정리하려면
docker system prune -af --volumes


컨테이너가 실행되지 않는 태그가 지정된 이미지를 제거하려면 약간의 스크립트를 사용해야합니다.

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

몇 주 전에 오래된 용기를 제거하십시오.

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

몇 주 전에 오래된 이미지를 삭제하세요. 조심해. 이렇게하면 몇 주 전에 생성되었지만 새 이미지에서 사용 중일 수있는 기본 이미지가 제거됩니다.

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


태그가 지정된 이미지를 제거하는 방법

  1. docker rmi 먼저 태그

  2. docker rmi 이미지.

    # that can be done in one docker rmi call e.g.: # docker rmi <repo:tag> <imageid>

(this works Nov 2016, Docker version 1.12.2)

e.g.

$ 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. Scripted remove anything older than 2 weeks.

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 system prune -a

(You'll be asked to confirm the command. Use -f to force run, if you know what you're doing.)


@VonC already gave a very nice answer, but for completeness here is a little script I have been using---and which also nukes any errand Docker processes should you have some:

#!/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 rm $(docker ps -faq)
docker rmi $(docker ps -faq)

-f force

-a all

-q in the mode


docker rm `docker ps -aq`

or

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

Occasionally I have run into issues where Docker will allocate and continue to use disk space, even when the space is not allocated to any particular image or existing container. The latest way I generated this issue accidentally was using "docker-engine" centos build instead of "docker" in RHEL 7.1. What seems to happen is sometimes the container clean-ups are not completed successfully and then the space is never reused. When the 80GB drive I allocated as / was filled with /var/lib/docker files I had to come up with a creative way to resolve the issue.

Here is what I came up with. First to resolve the disk full error:

  1. Stop docker: systemctl stop docker
  2. Allocated a new drive mounted as say /mnt/docker .
  3. Move all the files in /var/lib/docker to /mnt/docker . I used the command: rsync -aPHSx --remove-source-files /var/lib/docker/ /mnt/docker/
  4. Mount the new drive to /var/lib/docker.

At this point I no longer had a disk full error, but I was still wasting a huge amount of space. The next steps are to take care of that.

  1. Start Docker: systemctl start docker

  2. Save the all the images: docker save $(docker images |sed -e '/^/d' -e '/^REPOSITORY/d' -e 's,[ ][ ],:,' -e 's,[ ].,,') > /root/docker.img

  3. Uninstall docker.

  4. Erase everything in /var/lib/docker: rm -rf /var/lib/docker/[cdintv]*

  5. Reinstall docker

  6. Enable docker: systemctl enable docker

  7. Start docker: systemctl start docker

  8. Restore images: docker load < /root/docker.img

  9. Start any persistent containers you need running.

This dropped my disk usage from 67 GB for docker to 6 GB for docker.

I do not recommend this for everyday use. But it is useful to run when it looks like docker has lost track of used disk space do to software errors, or unexpected reboots.


If you wish to automatically/periodically clean up exited containers and remove images and volumes that aren't in use by a running container you can download the image meltwater/docker-cleanup.

Just run:

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

It runs every 30 minutes by default. You can however set the delay time by using this flag in seconds (DELAY_TIME=1800 option).

More details: https://github.com/meltwater/docker-cleanup/blob/master/README.md


Following command ll delete images older than 48 hours.

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

There is sparrow plugin docker-remove-dangling-images you can use to clean up stopped containers and unused (dangling) images:

$ sparrow plg run docker-remove-dangling-images

It works both for Linux and Windows OS.


First, run docker images to see list of images and copy IMAGE HASH ID into clipboard.

Run docker rmi -f <Image>

Remember option -f is force deleting.

참고URL : https://stackoverflow.com/questions/32723111/how-to-remove-old-and-unused-docker-images

반응형