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

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

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

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



답변

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

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)

[dangling images] 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 이상 이 있다고 가정하면 정리 명령을 사용할 수 있습니다. 오래된 이미지를 제거하기위한 질문에 대해서는 첫 번째 이미지를 원합니다.

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


답변

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


답변

이것은 나를 위해 일했다 :

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