etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2023. 4. 13. 10:23
반응형

질문자 :qkrijger


이 질문은 실행되지 않는 초과 Docker 컨테이너에 대해 우려해야 합니까?와 관련이 있습니다. .

오래된 용기를 제거하는 방법이 궁금합니다. docker rm 3e552code34a 사용하면 하나를 제거할 수 있지만 이미 많이 있습니다. docker rm --help 는 선택 옵션(전체 또는 이미지 이름별)을 제공하지 않습니다.

수동으로 쉽게 삭제할 수 있는 이러한 컨테이너가 저장된 디렉토리가 있습니까?



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

 docker container prune

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

Docker 시스템 정리도 있습니다 .

 docker system prune

하나의 명령으로 사용하지 않는 모든 컨테이너, 네트워크, 이미지(dangling 및 unreferenced) 및 선택적으로 볼륨을 정리합니다.


이전 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 에서 가져왔습니다.


Ken Cochrane

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 업데이트(2016년 4분기), VonC에 대한 크레딧( 이 스레드 뒷부분 ):

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

Docker 데몬 데이터가 디스크에서 차지하는 공간을 쉽게 시각화하고 "불필요한" 초과분을 쉽게 정리할 수 있는 몇 가지 새로운 명령을 소개하는 PR 26108commit 86de7c0을 참조하십시오.

 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

qkrijger

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

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

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

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

Ryan Walls

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

 docker rm `docker ps -aq`

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

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


Michael Neale

Docker 1.13(2016년 4분기)을 사용하면 다음과 같은 이점이 있습니다.

docker system prune -a 는 사용하지 않는 모든 데이터를 삭제합니다(즉, 순서대로: 컨테이너가 중지됨, 컨테이너가 없는 볼륨, 컨테이너가 없는 이미지).

docker system prune -a가 (이미지)으로 제거하지 않고 태그 만 매달려 이미지 또는 이미지에 주석 으로 smilebomb .

Docker 데몬 데이터가 디스크에서 차지하는 공간을 쉽게 시각화하고 "불필요한" 초과분을 쉽게 정리할 수 있는 몇 가지 새로운 명령을 소개하는 PR 26108commit 86de7c0을 참조하십시오.

 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

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

 docker container prune

VonC

2021년 업데이트됨 (최신)

 docker container prune

이것은 - 2017 (OLD) 방법

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

 docker rm $(docker ps -a -q)

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

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

levi

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의 답변)에게 감사드립니다.


caktux

중지된 모든 컨테이너를 제거합니다.

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

pauk960 의 댓글에서 :

버전 1.3.0 docker ps 와 함께 필터를 사용할 수 있습니다. grep Exited 대신 docker ps -a -f status=exited exited 를 사용합니다. 그리고 -q 함께 사용하면 전체 출력 대신 컨테이너 ID만 얻을 수 있으므로 awk를 사용할 필요가 없습니다.


Montells

docker ps -f before=<container-ID> 또는 docker ps -f since=<container-ID> 하여 특정 컨테이너 이전 또는 이후에 생성된 모든 컨테이너를 선택할 수 있습니다.

시스템을 개발했고 이제 작동하지만 컨테이너가 많이 남아 있다고 가정해 보겠습니다. 해당 작업 버전 이전에 생성된 컨테이너를 제거하려고 합니다. docker ps 를 사용하여 작업 컨테이너의 ID를 확인합니다.

다른 컨테이너보다 먼저 생성된 컨테이너 제거

 docker rm $(docker ps -f before=9c49c11c8d21 -q)

또 다른 예. Docker 컨테이너에서 이미 실행 중인 데이터베이스가 있습니다. 다른 컨테이너에서 실행되도록 애플리케이션을 개발했으며 이제 불필요한 컨테이너가 많이 있습니다.

특정 컨테이너 이후에 생성된 컨테이너 제거

 docker rm $(docker ps -f since=a6ca4661ec7f -q)

Docker는 /var/lib/docker/containers 에 컨테이너를 저장합니다. 여분의 컨테이너는 다른 해를 끼치 지 않지만 디스크 공간을 차지한다고 생각합니다.


vesako

업데이트: Docker 버전 1.13(2017년 1월 출시)부터 다음 명령을 실행하여 중지된 컨테이너, 미사용 볼륨, 매달린 이미지 및 미사용 네트워크를 정리할 수 있습니다.

 docker system prune

exited 상태의 컨테이너만 삭제하도록 하려면 다음을 사용하세요.

 docker ps -aq -f status=exited | xargs docker rm

마찬가지로 도커를 정리하는 경우 태그가 지정되지 않고 이름이 지정되지 않은 이미지를 다음과 같이 제거할 수 있습니다.

 docker images -q --no-trunc -f dangling=true | xargs docker rmi

L0j1k

다음은 태그가 지정되지 않은 컨테이너와 이미지를 제거하는 docker-cleanup 업데이트가 있는지 소스를 확인하십시오.

 #!/bin/sh # Cleanup docker files: untagged containers and images. # # Use `docker-cleanup -n` for a dry run to see what would be deleted. untagged_containers() { # Print containers using untagged images: $1 is used with awk's print: 0=line, 1=column 1. docker ps -a | awk '$2 ~ "[0-9a-f]{12}" {print $'$1'}' } untagged_images() { # Print untagged images: $1 is used with awk's print: 0=line, 3=column 3. # NOTE: intermediate images (via -a) seem to only cause # "Error: Conflict, foobarid wasn't deleted" messages. # Might be useful sometimes when Docker messed things up?! # docker images -a | awk '$1 == "<none>" {print $'$1'}' docker images | tail -n +2 | awk '$1 == "<none>" {print $'$1'}' } # Dry-run. if [ "$1" = "-n" ]; then echo "=== Containers with uncommitted images: ===" untagged_containers 0 echo echo "=== Uncommitted images: ===" untagged_images 0 exit fi # Remove containers with untagged images. echo "Removing containers:" >&2 untagged_containers 1 | xargs --no-run-if-empty docker rm --volumes=true # Remove untagged images echo "Removing images:" >&2 untagged_images 3 | xargs --no-run-if-empty docker rmi

출처: https://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup


blueyed

먼저 컨테이너를 제거하기 전에 실행 중인 컨테이너를 중지합니다.

실행 중인 컨테이너 제거

 docker rm $(docker stop -t=1 $(docker ps -q))

stop 대신 kill 을 사용할 수 있습니다. 제 경우에는 stop 선호하고 매번 새로 만드는 경향이 있으므로 멋지게 종료하려고 합니다.

참고: 컨테이너를 중지하려고 하면 오류가 발생합니다.

오류: 실행 중인 컨테이너를 제거할 수 없습니다. 먼저 중지하십시오.

모든 컨테이너 제거

 docker rm $(docker ps -a -q)

Ulises

Windows 셸에서 모든 컨테이너 제거:

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

Bartosz Bilicki

https://github.com/HardySimpson/docker-cleanup

도커 정리

다음을 제거하는 작은 올인원 쉘:

  • 하루 이상 실행되지 않은 컨테이너
  • 나머지 컨테이너에 속하지 않는 이미지

crontab 작업으로 실행하려고 합니다.

특징

  • <none>:<none> 이미지를 제거합니다.
  • 이미지에 여러 repo:tag 참조가 있는 경우 컨테이너 실행을 제외하고 모든 repo:tag가 제거됩니다. 실제로 "docker rmi"의 특성입니다.
  • 많은 오류 메시지가 화면에 표시되며 2>/dev/null
  • docker-gc에서 무언가를 배우고 문제를 수정합니다(여러 개의 repo:tag가 있는 이미지는 제거할 수 없음).

HardySimpson

따라서 개인적으로 가장 최근 n개의 컨테이너와 이미지만 유지하면서 이미지와 컨테이너 모두에 대한 배포 스크립트의 일부로 이 작업을 수행하는 것이 좋습니다. git tag 와 함께 사용하는 것과 동일한 버전 관리 스키마로 Docker 이미지에 태그를 지정하고 항상 최신 Docker 이미지에 "latest" 태그를 지정합니다. 즉, 아무것도 정리하지 않으면 내 Docker 이미지가 다음과 같이 표시됩니다.

 REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE some_repo/some_image 0.0.5 8f1a7c7ba93c 23 hours ago 925.4 MB some_repo/some_image latest 8f1a7c7ba93c 23 hours ago 925.4 MB some_repo/some_image 0.0.4 0beabfa514ea 45 hours ago 925.4 MB some_repo/some_image 0.0.3 54302cd10bf2 6 days ago 978.5 MB some_repo/some_image 0.0.2 0078b30f3d9a 7 days ago 978.5 MB some_repo/some_image 0.0.1 sdfgdf0f3d9a 8 days ago 938.5 MB

물론 이제 모든 이미지(또는 컨테이너)를 모든 프로덕션 상자에서 영구적으로 유지하고 싶지 않습니다. 나는 롤백을 위해 마지막 3 또는 4를 원하고 다른 모든 것을 제거하기를 원합니다. Unix의 tail 는 여기에서 가장 친한 친구입니다. docker imagesdocker ps 모두 날짜순이므로 tail 을 사용하여 상위 3개를 제외한 모든 항목을 선택하고 제거할 수 있습니다.

 docker rmi $(docker images -q | tail -n +4)

배포 스크립트(또는 로컬로)와 함께 실행하여 공간을 너무 많이 차지하거나 오래된 이미지로 물건을 복잡하게 만들지 않고 편안하게 롤백할 수 있는 충분한 이미지를 항상 유지하십시오.

개인적으로 저는 생산 상자에 항상 하나의 컨테이너만 보관하지만 더 많은 것을 원하면 컨테이너로 동일한 종류의 작업을 수행할 수 있습니다.

 docker rm $(docker ps -aq | tail -n +4)

마지막으로, 단순화된 예제에서는 한 번에 하나의 저장소만 다루지만 더 많은 저장소가 있는 경우 동일한 아이디어로 좀 더 정교해질 수 있습니다. some_repo/some_image에서 마지막 세 개의 이미지를 유지하고 싶다고 가정해 보겠습니다. grepawk 섞어서 진행하면 됩니다.

 docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4)

다시 말하지만, 동일한 아이디어가 컨테이너에도 적용되지만 이 시점에서 이해하게 되므로 예제 제공을 중단하겠습니다.


Eli

사용하다:

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

로컬에 있는 모든 컨테이너를 강제로 중지하고 제거합니다.


Shashank G

가장 오래된 컨테이너 5개 제거:

 docker rm `docker ps -aq | tail -n 5`

남은 컨테이너 수 확인:

 docker ps -aq | wc -l

Pithikos

중지된 모든 컨테이너를 제거합니다.

sudo 도커 rm $(sudo 도커 ps -a -q)

docker ps -a -q를 사용하여 모든 컨테이너 목록을 가져오고 해당 ID를 docker rm에 전달하여 중지된 모든 컨테이너를 제거합니다. 이것은 실행 중인 컨테이너를 제거해서는 안 되며 실행 중인 이미지를 제거할 수 없다는 메시지가 표시됩니다.

태그가 지정되지 않은 모든 이미지 제거

이제 공간을 절약하기 위해 오래된 이미지를 정리하려고 합니다.

sudo 도커 rmi $(sudo 도커 이미지 -q --filter "dangling=true")


Ric_Harvey

새로운 방법: spotify/docker-gc가 트릭을 재생합니다.

 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
  • 1시간 이상 전에 종료된 컨테이너는 제거됩니다.
  • 그 이후에 남은 컨테이너에 속하지 않는 이미지는 제거됩니다.

환경 설정을 지원했습니다.

태그가 여러 개인 이미지를 강제로 삭제

 FORCE_IMAGE_REMOVAL=1

컨테이너 강제 삭제

 FORCE_CONTAINER_REMOVAL=1

가비지 컬렉션에서 최근 종료된 컨테이너 및 이미지 제외

 GRACE_PERIOD_SECONDS=86400

또한 이 설정은 GRACE_PERIOD_SECONDS초 전에 생성된 이미지를 제거하지 못하도록 합니다.

드라이런

 DRY_RUN=1

분리된 컨테이너 볼륨 정리 CLEAN_UP_VOLUMES=1

참조: docker-gc

예전 방식:

실행되지 않는 오래된 컨테이너 삭제

 docker ps -a -q -f status=exited | xargs --no-run-if-empty docker rm OR docker rm $(docker ps -a -q)

실행되지 않는 도커 컨테이너와 관련된 모든 이미지 삭제

 docker images -q | xargs --no-run-if-empty docker rmi

도커 버전 1.10.x 이상에 대한 분리된 도커 볼륨 정리

 docker volume ls -qf dangling=true | xargs -r docker volume rm

기간을 기준으로

 docker ps -a | grep "weeks ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm docker ps -a | grep "days ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm docker ps -a | grep "hours ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm

f-society

  1. 모든 도커 프로세스를 제거합니다.

     docker rm $(docker ps -a -q)
  2. 특정 컨테이너 제거:

     $ docker ps -a (lists all old containers) $ docker rm container-Id

padakpadak

다음 명령을 사용하여 종료된 컨테이너를 제거할 수 있습니다.

 docker rm $(sudo docker ps -a | grep Exit | cut -d ' ' -f 1)

다음은 docker에서 이전 이미지를 제거하는 전체 요지입니다. Gist to remove old Docker container and images .


urodoz

#!/bin/bash # docker-gc --- Remove stopped docker containers RUNNING=$(docker ps -q) ALL=$(docker ps -a -q) for container in $ALL ; do [[ "$RUNNING" =~ "$container" ]] && continue echo Removing container: $(docker rm $container) done

mckoss

중지된 컨테이너만 제거할 수 있습니다. 처음에 모두 중지

docker stop $(docker ps -a -q)

그런 다음 제거할 수 있습니다.

docker rm $(docker ps -a -q)


Marcin Szymczak

나는 항상 모든 이미지를 제거하기 docker rmi $(docker ps -a -q)

docker rmi 실패하면 /var/lib/docker/graph 디렉토리를 제거할 수 있습니다.


sunny

모든 컨테이너 및 이미지를 중지/제거하는 기본 단계

  1. 모든 컨테이너 나열

    docker ps -aq

  2. 실행 중인 모든 컨테이너 중지

    docker stop $(docker ps -aq)

  3. 모든 컨테이너 제거

    docker rm $(docker ps -aq)

  4. 모든 이미지 제거

    docker rmi $(docker images -q)

참고: 먼저 실행 중인 모든 컨테이너를 제거하기 전에 중지해야 합니다. 또한 이미지를 제거하기 전에 종속 컨테이너를 중지하고 제거해야 합니다.


Murali Manchadikkal

종료다시 시작 도커 컨테이너를 삭제하기 위해 다음 명령을 사용하고 있습니다.

 docker stop --force $(docker ps -a|grep Exited| awk '{print $1}') docker rm --force $(docker ps -a|grep Exited| awk '{print $1}') docker stop --force $(docker ps -a|grep Restarting| awk '{print $1}') docker rm --force $(docker ps -a|grep Restarting| awk '{print $1}')

아래 명령을 사용하여 없음으로 명명된 이미지 제거

 docker image rm --force $(docker image ls |grep none |awk '{print $3}')

Sijo M Cyril

컨테이너와 댕글링 이미지를 청소하려면 이 명령을 시도하십시오.

 docker system prune -a

Pal

관심 있는 사람을 위해 qkrijger에서 예제를 가져와서 모두 지우기(중지 및 모두 제거)로 전환했습니다.

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

Kraig McConaghy

실행 중인 컨테이너에서 현재 사용하지 않는 모든 것을 간단히 제거하려면 일반적으로 .bash_profile 에 넣는 다음 별칭 이 도움이 될 것입니다.

 alias dockerclean="docker ps -q -a | xargs docker rm -v && docker images -q | xargs docker rmi"

dockerclean 이 명령줄에서 호출될 때마다 중지된 컨테이너와 사용되지 않는 이미지 레이어가 제거됩니다. 실행 중인 컨테이너 및 사용된 이미지의 경우 경고 메시지를 인쇄하고 건너뜁니다.


0x7d7b

#!/bin/bash echo Cleanup unused containers unused_containers=$(docker ps -a -q --filter="status=exited") if [[ -n $unused_containers ]] then docker rm $unused_containers fi echo Cleanup unused images unused_images=$(docker images | grep '^<none>' | awk '{print $3}') if [[ -n $unused_images ]] then docker rmi $unused_images fi

AleX

출처 : http:www.stackoverflow.com/questions/17236796/how-to-remove-old-docker-containers

반응형