[docker] 오래된 Docker 컨테이너를 제거하는 방법

이 질문은 과도하고 비 실행중인 Docker 컨테이너에 대해 걱정해야합니까? .

오래된 컨테이너를 제거하는 방법이 궁금합니다. 는 docker rm 3e552code34a단일 하나를 제거 할 수 있습니다,하지만 난 이미 많이 있습니다. docker rm --help전체 또는 이미지 이름과 같은 선택 옵션을 제공하지 않습니다.

어쩌면 수동으로 쉽게 삭제할 수있는 컨테이너가 저장되어있는 디렉토리가 있습니까?



답변

Docker 1.13.x 부터 Docker 컨테이너 정리 를 사용할 수 있습니다 .

docker container prune

이렇게하면 중지 된 컨테이너가 모두 제거되고 모든 플랫폼에서 동일한 방식으로 작동해야합니다.

도있다 도커 시스템 자두는 :

docker system prune

하나의 명령으로 사용되지 않은 모든 컨테이너, 네트워크, 이미지 (댕글 링 및 참조되지 않은) 및 선택적으로 볼륨을 정리합니다.


이전 Docker 버전의 경우 Docker 명령을 다른 Unix 명령과 함께 묶어 필요한 것을 얻을 수 있습니다. 다음은 몇 주 된 오래된 컨테이너를 정리하는 방법에 대한 예입니다.

$ docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm

크레딧을 제공하기 위해 https://twitter.com/jpetazzo/status/347431091415703552의 예입니다 .


답변

내가 Guillaume J. Charmes에서 얻은 또 다른 방법 (기한이있는 신용) :

docker rm `docker ps --no-trunc -aq`

모든 용기를 우아한 방식으로 제거합니다.

Windows 용 Bartosz Bilicki의 경우 :

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i

PowerShell의 경우 :

docker rm @(docker ps -aq)

Docker 1.13 (Q4 2016) 업데이트, VonC ( 이 스레드의 후반부 )에 기여 :

docker system prune 사용하지 않는 모든 데이터를 삭제합니다 (예 : 컨테이너가 중지되고 컨테이너가없는 볼륨 및 컨테이너가없는 이미지).

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

docker system prune

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y


답변

대답 업데이트
사용 docker system prune또는 docker container prune지금을. VonC의 업데이트 된 답변을 참조하십시오 .

이전 답변
위의 여러 힌트를 구성하여 실행되지 않는 컨테이너를 모두 제거하는 가장 우아한 방법은 다음과 같습니다.

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

  • -q 컨테이너 ID 만 인쇄합니다 (열 헤더 없음)
  • -f 인쇄 된 컨테이너 목록을 필터링 할 수 있습니다 (이 경우 종료 된 컨테이너 만 표시하도록 필터링 함).

답변

공식적인 방법 은 다음과 같습니다.

docker rm `docker ps -aq`

Docker 관리자는 이에 대한 명령이 없다고 표시했으며 다음과 같은 명령을 작성합니다.

우리는 이것을 전에 논의했으며 Docker에 코드를 추가하지 않고도 위의 줄을 사용하는 것을 선호합니다.


답변

Docker 1.13 (2016 년 4 분기)을 사용하면 다음이 가능합니다.

docker system prune -a 사용하지 않는 모든 데이터를 삭제합니다 (예 : 컨테이너가 중지되고 컨테이너가없는 볼륨 및 컨테이너가없는 이미지).

docker system prune-a가 없으면 smilebomb의 코멘트따라 매달린 이미지 또는 태그가없는 이미지 만 제거합니다 (이미지의 경우). .

PR 26108commit 86de7c0을 참조 하면 Docker 데몬 데이터가 디스크에서 차지하는 공간을 시각화하고 “필요하지 않은”초과 량을 쉽게 정리할 수 있도록 몇 가지 새로운 명령이 도입되었습니다.

docker system prune -a

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

wjv가 언급 했듯이

또한 유형의 객체에서 docker {container,image,volume,network} prune사용되지 않는 인스턴스를 제거하는 데 사용될 수도 있습니다 .

commit 913e5cb에 도입되었으며 Docker 1.13+에만 해당됩니다.

docker container prune


답변

다음 과 함께 필터링 을 사용할 수 있습니다 docker ps.

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

그리고 이미지의 경우 :

docker rmi $(docker images -q -f "dangling=true")

그러나 일치하는 컨테이너가 없으면 오류 가 발생 docker rm하거나 docker rmi오류가 발생합니다. 오래된 docker rm $(docker ps -aq)트릭은 실행중인 컨테이너를 제거하려고 시도하면서 각 컨테이너에 실패하면서 더욱 악화되었습니다.

~/.bashrc또는 에 추가 할 수있는 깔끔한 스크립트는 다음과 같습니다 ~/.profile.

# Use `docker-cleanup --dry-run` to see what would be deleted.

function docker-cleanup {
  EXITED=$(docker ps -q -f status=exited)
  DANGLING=$(docker images -q -f "dangling=true")

  if [ "$1" == "--dry-run" ]; then
    echo "==> Would stop containers:"
    echo $EXITED
    echo "==> And images:"
    echo $DANGLING
  else
    if [ -n "$EXITED" ]; then
      docker rm $EXITED
    else
      echo "No containers to remove."
    fi
    if [ -n "$DANGLING" ]; then
      docker rmi $DANGLING
    else
      echo "No images to remove."
    fi
  fi
}

편집 : 아래에서 언급했듯이 원래 답변은 컨테이너가 아닌 이미지를 제거하는 것이 었습니다. 설명서에 대한 새로운 링크를 포함하여 두 가지에 모두 답변하도록 업데이트되었습니다. 새로운 ps필터링에 대해 언급 한 Adrian (및 Ryan의 답변)에게 감사합니다 .


답변

2019 업데이트 (최신)

docker container prune

-2017 (OLD) 방식

중지 된 컨테이너를 모두 제거하려면

docker rm $(docker ps -a -q)

모든 컨테이너 를 제거하려면 (중지 및 중지되지 않음)

docker rm  -f $(docker ps -a -q)