programing

오래된 도커 이미지와 사용되지 않은 도커 이미지를 제거하는 방법

topblog 2023. 8. 11. 21:27
반응형

오래된 도커 이미지와 사용되지 않은 도커 이미지를 제거하는 방법

도커를 장시간 실행하면 시스템에 많은 이미지가 있습니다.사용하지 않는 모든 도커 이미지를 안전하게 한 번에 제거하여 저장 공간을 확보하려면 어떻게 해야 합니까?

몇 달 전에 중 . 올바른 이미지는TAG.

따라서 태그가 없는 이미지만 제거하라는 것은 아닙니다.되지 않는 이미지를 에는 태그가 와 몇 달 상태로 이미지와 같은 포함됩니다.TAG.

(원답은 아래 참조)


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

docker system prune 매달린 모든 데이터(컨테이너, 네트워크 및 이미지)를 삭제합니다.사용하지 않는 모든 볼륨을--volumes옵션을 선택하고 사용되지 않는 모든 이미지를 제거합니다(단순히 매달리는 것만이 아님).-a선택.

또한 다음과 같은 이점이 있습니다.

사용하지 않는 이미지의 경우docker image prune -a(달가운 이미지와 사용하지 않은 이미지를 제거하는 데 사용됨).)
경고: '사용되지 않음'은 "컨테이너에서 참조하지 않은 이미지"를 의미합니다. 사용하기 전에 주의하십시오.-a.

AL답변에서 설명한 것처럼,docker system prune --all매달리는 이미지뿐만 아니라 사용되지 않는 모든 이미지를 제거합니다.그건 좀 심할 수도 있어요.

docker xxx prune옵션을 사용하면 프루닝을 제한할 수 있는 좋은 방법이 될 수 있습니다(도커 SDK API 1.28 최소값, 따라서 도커 17.04+).

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

  • until (<timestamp>)된 컨테이너,및 합니다.
  • label(label=<key>,label=<key>=<value>,label!=<key>또는label!=<key>=<value>) - 경우에 따라 컨테이너, 이미지, 네트워크 및 볼륨만 제거합니다.label!=...(사용됨) 지정된 레이블입니다.

예는 "이미지 잘라내기"를 참조하십시오.


" 또는 미리보기: ""--dry-run을 선택할 수 있습니다.docker xxx prune명령을 실행합니다.

이것은 2017년부터 30623호와 함께 요청되었지만, 시행하기가 까다로워 보입니다(2022년 8월).

가지치기될 것에 대한 보다 대표적인 개요를 갖는 것은 다양한 이유로 인해 상당히 복잡할 것입니다.

  • 경주 조건(제한 사항을 문서화하여 해결할 수 있음)
    컨테이너/이미지/볼륨/네트워크는 "드라이 런"이 사용될 때 사용되지 않을 수 있지만 실제 제거가 실행되는 순간에 사용될 수도 있습니다(또는 그 반대의 경우도 마찬가지입니다). 따라서 드라이 런은 항상 제거될 항목의 "대략"이 됩니다.
  • 더 어려운 부분은 객체(컨테이너, 이미지, 네트워크)가 서로 의존하는 방식 때문입니다.
    예를 들어 이미지에 대한 참조가 더 이상 없는 경우(더 이상 태그 또는 사용하는 컨테이너 없음) 이미지를 삭제할 수 있습니다. 이는 도커 시스템 제거가 개체를 특정 순서로 삭제하는 이유입니다(먼저 사용하지 않는 모든 컨테이너를 제거한 다음 사용하지 않는 이미지를 제거함).
    "dry-run"에 대해 동일한 흐름을 복제하려면 일시적으로 모든 개체의 표현과 이를 기반으로 참조되는 위치를 구성해야 합니다(기본적으로 모든 참조 카운터를 복제한 다음 해당 "그림자" 표현에서 참조를 제거합니다).
  • 마지막으로 스냅샷(이미지계층 저장소)통합하는 작업을 수행하면 상황이 더 달라질 수 있습니다.
    예를 들어, 이미지는 이제 멀티아치가 될 수 있으며, (논의 대상으로) "자르기"는 공간을 정리하기 위해 이미지에서 사용되지 않는 변형(아키텍처)을 제거할 수 있으며, 이는 "제거할 수 있는 것"을 계산하는 데 또 다른 차원을 제공합니다.

원답 (2016년 9월)

주로 하는 일은:

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

나는 [ 매달린 이미지들을 제거하기 위한 별칭을 가지고 있습니다:drmi]13

dangling=true 사용하지 않은 . 는 사용되지 않은 이미지를 찾습니다.

그러면 레이블이 지정된 이미지에서 더 이상 참조하지 않는 중간 이미지가 제거됩니다.

종료된 프로세스(컨테이너)대해서도 동일한 작업을 먼저 수행합니다.

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

haridsv코멘트에서 지적한 것처럼:

기술적으로, 이미지를 정리하기 전에 먼저 용기를 정리해야 합니다. 그러면많은 이미지가 걸리고 오류가 줄어들기 때문입니다.


제스 프레이저(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
}

"참조되지 않은" 영상뿐만 아니라 이전 영상을 제거하려면 다음을 고려할 수 있습니다.


간단한 도커 컨테이너 및 이미지 가비지 수집 스크립트.

  • 한 시간 이상 전에 종료된 컨테이너가 제거됩니다.
  • 이후 남은 컨테이너에 속하지 않는 이미지는 제거됩니다.

두 번째 업데이트(2017-07-08)

의 VonC 다다참오시십조시하보여사를용하신최전을 하여 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 system prune # doesn't clean out old images
docker system prune --all # cleans out too much

두 해서 하만나두명중무간필언다그요서, 래지했가가에령는의▁but.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-message

한 달 이상 지난 오래된 태그가 지정된 이미지를 제거하려면 다음과 같이 하십시오.

$ 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

문서에 따르면 다음 명령은 48시간보다 오래된 이미지를 삭제합니다.

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

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 prune그리고.docker container prune명령을 실행합니다.

지금까지(도커 버전 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

이것은 저에게 효과가 있었습니다.

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

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

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

다음은 도커 이미지를 정리하고 공간을 회수하는 스크립트입니다.

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

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

큰 공간을 하고, 더큰디공마컨고이수습다의 할 수 ./var/lib/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

docker system prune -a

(명령을 확인하라는 메시지가 표시됩니다. 사용-f당신이 무엇을 하고 있는지 안다면, 강제로 도망치는 것.)

@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

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

#!/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. 먼저 태그를 도킹합니다.

  2. 도커미 이미지.

    한 도커에서 수행할 수 있습니다. 예:도커 rmi <repo:tag> <imageid>

(이 작업은 2016년 11월, 도커 버전 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
docker rm $(docker ps -faq)
docker rmi $(docker ps -faq)

-f 힘

-전체의

모드에서 -q

먼저, 행실을 합니다.docker images이미지 목록을 보고 IMAGE HASH ID를 클립보드에 복사합니다.

려달을 합니다.docker rmi -f <Image>

기억하기-f강제 삭제입니다.

가끔 Docker가 특정 이미지 또는 기존 컨테이너에 디스크 공간을 할당하지 않은 경우에도 디스크 공간을 할당하고 계속 사용하는 문제가 발생했습니다.로 이 문제를 의 방법은 1에서 " 대신 " build를 사용한 입니다.컨테이너 정리가 성공적으로 완료되지 않은 경우 공간이 재사용되지 않는 경우가 있습니다.를 80GB 드라이브로 한 / 찼습다니로 가득 ./var/lib/docker이 문제를 해결하기 위해 창의적인 방법을 생각해내야 했습니다.

여기 제가 생각해 낸 것이 있습니다.먼저 디스크 전체 오류를 해결합니다.

  1. 도커: 도커중지:systemctl stop docker

  2. 새 했습니다(예: " 다과같마이된")./mnt/docker.

  3. 모파일에 있는 모든 합니다./var/lib/docker/mnt/docker다음 명령을 사용했습니다.

    rsync -aPHSx --remove-source-files /var/lib/docker/ /mnt/docker/
    
  4. 새 드라이브를 에 마운트합니다./var/lib/docker.

이 시점에서는 더 이상 디스크 전체 오류가 발생하지 않았지만 여전히 엄청난 공간을 낭비하고 있었습니다.다음 단계는 그것을 처리하는 것입니다.

  1. 도커: 도커시:systemctl start docker

  2. 모든 영상을 저장합니다.

    docker save $(docker images |sed -e '/^<none>/d' -e '/^REPOSITORY/d' -e 's,[ ][ ]*,:,' -e 's,[ ].*,,') > /root/docker.img
    
  3. 도커를 제거합니다.

  4. ▁in의 모든 것을 ./var/lib/docker:

    rm -rf /var/lib/docker/[cdintv]*
    
  5. 도커 다시 설치

  6. 사용: 도커사:systemctl enable docker

  7. 도커: 도커시작:systemctl start docker

  8. 이미지 복원:

    docker load < /root/docker.img
    
  9. 실행해야 하는 영구 컨테이너를 시작합니다.

이로 인해 디스크 사용량이 도커의 경우 67GB에서 도커의 경우 6GB로 감소했습니다.

저는 이것을 일상적으로 사용하는 것을 추천하지 않습니다.그러나 소프트웨어 오류 또는 예기치 않은 재부팅으로 인해 도커가 사용된 디스크 공간을 추적하지 못한 것처럼 보일 때 실행하는 것이 유용합니다.

docker rm `docker ps -aq`

또는

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

중인 " " " 를 할 수 있습니다.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=임시 옵션).

자세한 정보: https://github.com/meltwater/docker-cleanup/blob/master/README.md

에서) 하십시오.docker image prune이미지에 이름은 명령무하최명필이모제종거요든할고다려것속니때하을입문합이다성기니로변야어아되경령도마이은이름한미뚝신고뚝지에명▁as▁be▁renamed▁to합▁shouldthe(다▁command▁the▁isencies▁probably).docker image*s* prune).

파이프라인및 tag곳을가 생각해 낸 =곳한안있이는인라파이별프그드▁the▁in을▁the일▁build▁(dates▁i은솔▁are도▁my▁solution▁imagewhere▁tags션에 있습니다.YYYYMMDDformat다음과 같습니다.

# carefully narrow down the image to be deleted (to avoid removing useful static stuff like base images)
my_deleted_image=mirekphd/ml-cpu-py37-vsc-cust

# define the monitored image (tested for obsolescence), which will be usually the same as deleted one, unless deleting some very infrequently built image which requires a separate "clock"
monitored_image=mirekphd/ml-cache

# calculate the oldest acceptable tag (date)
date_week_ago=$(date -d "last week" '+%Y%m%d')

# get the IDs of obsolete tags of our deleted image
# note we use monitored_image to test for obsolescence
my_deleted_image_obsolete_tag_ids=$(docker images --filter="before=$monitored_image:$date_week_ago" | grep $my_deleted_image | awk '{print $3}')

# remove the obsolete tags of the deleted image
# (note it typically has to be forced using -f switch)
docker rmi -f $my_deleted_image_obsolete_tag_ids

도커 시스템 제거에 대한 공식 참조 참조

docker system prune제거할 대상:

  • 중지된 모든 컨테이너
  • 모든 네트워크가 하나 이상의 컨테이너에서 사용되지 않음
  • 모든 현란한 이미지
  • 전체 빌드 캐시

docker system prune -a마찬가지이지만 매달린 이미지를 모두 제거하는 것 외에도 다음과 같은 작업을 보다 광범위하게 제거합니다.

  • 하나 이상의 컨테이너가 연결되지 않은 모든 이미지

매달린 이미지란 무엇입니까?

도커 이미지는 도커 파일에서 전체 컨테이너 이미지가 생성될 때 상위 '컨테이너 레이어' 안에 감겨지는 여러 레이어로 구성됩니다.매달린 이미지는 다른 태그가 지정된 이미지와 관련이 없는 레이어이므로 빌드된 새 컨테이너에서 사용할 수 없습니다.더 이상 목적을 달성하지 못하고 디스크 공간을 사용합니다.

예를 들어, 다음 프로세스를 통해 매달린 이미지를 만들 수 있습니다.

된 이미지 my-image태그를 지정하지 않고 도커 파일에서:

FROM ubuntu:latest
CMD ["echo", "Hello World"]

docker build -t my-image

docker images

REPOSITORY   TAG       IMAGE ID
my-image     latest    7ed6e7202eca   <--- created, not dangling
ubuntu       latest    825d55fb6340

도커 파일 업데이트:

FROM ubuntu:latest
CMD ["echo", "Hello, World!"]

태그를 지정하지 않고 이전 이름을 다시 사용하여 이미지 재구성:

docker build -t my-image

docker images

REPOSITORY   TAG       IMAGE ID
my-image     latest    da6e74196f66   <--- replacement layer
<none>       <none>    7ed6e7202eca   <--- previous layer, now dangling
ubuntu       latest    825d55fb6340

빌드가 새 항목을 생성했습니다.my-image 있지만가 레어로 . 보시다시피 원래 생성된 레이어는 그대로 있지만 이름과 태그가 다음과 같이 설정되어 있습니다.<none>:<none>층과 입니다. '', 'dangling', 'dangling', 'dangling입니다.

하나 이상의 컨테이너가 연결되지 않은 이미지란 무엇입니까?

사용되지 않는 이미지는 컨테이너에 할당되거나 사용되지 않았음을 의미합니다.를 들면, 들면를예,docker ps -a실행 중인 컨테이너와 중지된 컨테이너가 모두 나열됩니다.이러한 용기에서 사용 중인 이미지는 "사용된 이미지"입니다.

도커 시스템 제거 -a를 실행하면 사용되지 않는 이미지와 매달린 이미지가 모두 제거됩니다.하나 이상의 컨테이너가 연결된 이미지는 영향을 받지 않습니다.

중지된 컨테이너와 사용되지 않은(달려짐) 이미지를 정리하는 데 사용할 수 있는 스패로우 플러그인 도커-제거-달려짐-이미지가 있습니다.

$ sparrow plg run docker-remove-dangling-images

Linux 및 Windows OS 모두에서 작동합니다.

만약 당신이 그것들을 많이 가지고 있다면, 그것들을 제거하는 것은 정말 지루할 수 있지만, 우리에게 도커는 우리가 매달린 이미지들을 제거하는 것을 도와주는 몇 가지 명령을 가지고 있어서 다행입니다.Docker의 이전 버전(오늘날에도 여전히 작동함)에서는 다음을 실행하여 매달린 이미지를 삭제할 수 있습니다.docker rmi -f $(docker images -f "dangling=true" -q) .

난보통한다를 합니다.docker rm -f $(docker ps -a -q)그리고.docker system prune매달린 모든 용기를 제거합니다.

[해결됨] 도커 포럼에서 이 스레드를 따라야 합니다.

그리고 나는 단지 출구를 찾을 뿐입니다.

모든 용기를 제거할 수 있는 유일한 솔루션:

docker ps -a | cut -d ' ' -f 1 | xargs docker rm

cut -d ' ' -f 1모든 컨테이너의 ID를 반환합니다.

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

반응형