IT이야기

Docker Registry 2.0-사용하지 않는 이미지를 삭제하는 방법

cyworld 2021. 4. 1. 21:47
반응형

Docker Registry 2.0-사용하지 않는 이미지를 삭제하는 방법은 무엇입니까?


개인 도커 레지스트리를 공식 레지스트리 2.0으로 업데이트했습니다. 이 버전은 이제 해시 태그로 식별 된 도커 이미지를 삭제할 수 있지만 ( https://docs.docker.com/registry/spec/api/#deleting-an-image 참조 ) 여전히 오래된 이미지를 정리하는 방법을 볼 수 없습니다.

CI 서버가 지속적으로 새 이미지를 생성하므로 더 이상 명명 된 태그로 식별되지 않는 개인 레지스트리에서 모든 이미지를 삭제하는 방법이 필요합니다.

이 작업을 수행하는 기본 제공 방법이없는 경우 사용자 지정 스크립트가 작동 할 수 있다고 생각하지만 이미지의 저장된 해시 태그를 모두 나열하는 v2 API 메서드도 보이지 않습니다.

개인 레지스트리를 깨끗하게 유지하려면 어떻게해야합니까? 힌트가 있습니까?


이미지 삭제 (내 CI에서와 같이 마지막 버전 10 개를 유지할 수 있음)는 세 단계로 수행됩니다.

  1. 환경 변수를 설정 REGISTRY_STORAGE_DELETE_ENABLED: "true"하고 docker-registry에 전달 하여 이미지 삭제를 활성화합니다.

  2. 아래 스크립트 실행 (모든 이미지와 태그는 삭제되지만 마지막 10 개 버전은 유지됨)

    registry.py -l 사용자 : pass -r https://example.com:5000 --delete --num 10

  3. 가비지 수집 실행 (일일 크론 작업에 넣을 수 있음)

    docker-compose -f [path_to_your_docker_compose_file] 레지스트리 실행 bin / registry garbage-collect /etc/docker/registry/config.yml

registry.py는 아래 링크에서 다운로드 할 수 있으며 이미지, 태그 및 레이어를 나열하고 특정 이미지 및 / 또는 태그를 삭제할 수도 있습니다.

https://github.com/andrey-pohilko/registry-cli

가비지 수집 전에 레지스트리 폴더는 7Gb였으며 위의 단계를 실행 한 후 1Gb로 축소되었습니다.


추악하지만 할 수 있습니다. 당신은 (내 생각에) 레지스트리 2.3 이상을 실행하고 삭제를 활성화해야합니다 ( REGISTRY_STORAGE_DELETE_ENABLED=Trueenv var 또는 동등한 것). 아래의 예제 명령은에서 로컬 파일 저장소를 가정 /srv/docker-registry하지만 다른 저장소 백엔드에 대해 동등한 것을 만들 수없는 경우 놀랄 것입니다.

정리하려는 각 저장소에 대해 더 이상 필요하지 않은 다이제스트 참조를 열거해야합니다. 이 작업을 수행하는 가장 쉬운 방법 latest은이 경우 예제를 사용하여 태그별로 수행하는 것입니다.

ls -1tr /srv/docker-registry/v2/repositories/<repo>/_manifests/tags/latest/index/sha256 \
| tail -n +3

latest태그에 푸시 된 가장 최근 다이제스트 3 개를 제외한 모든 목록이 표시됩니다 . 또는 태그에 별로 신경 쓰지 않지만 마지막 몇 개의 참조 만 푸시하려면 다음을 수행 할 수 있습니다.

ls -1t /srv/docker-registry/v2/repositories/<repo>/_manifests/revisions/sha256 \
| tail -n +3

그런 다음 필요하지 않은 참조를 삭제하면됩니다.

for hash in $(ls -1t /srv/docker-registry/v2/repositories/<repo>/_manifests/tags/latest/index/sha256 | tail -n +3); do
  curl -X DELETE https://registry:5000/v2/<repo>/manifests/sha256:$hash
done

마지막으로 레지스트리가 실제로 아무것도 삭제 하지 않는 "소프트 삭제"를 구현하기 때문에 GC 실행을 수행해야합니다 .

docker exec docker-registry /bin/registry \
  garbage-collect /path/to/config.yml

예, 주어진 태그와 관련된 모든 다이제스트를 열거하는 API 메서드가 없기 때문에 백엔드 저장소에서 으르렁 거리며 지저분합니다.하지만 쿠키가 무너지는 방식입니다.


귀하의 질문에 관하여 :

더 이상 명명 된 태그로 식별되지 않는 개인 레지스트리에서 모든 이미지를 삭제하는 방법이 필요합니다.

새로운 버전의 도커 레지스트리 distribution/registry:master에는이 멋진 기능이 있습니다! 그러나 API에서 트리거 할 수는 없습니다 .

어쨌든 레지스트리에서 태그가 지정되지 않은 모든 매니페스트를 정리할 수 있습니다. 즉, 덮어 쓴 모든 태그 레지스트리에 오래된 매니페스트와 Blob남기지 않습니다 . 모든 "사용되지 않는"레이어는 레지스트리 가비지 수집기에 의해 정리됩니다.

다음을 실행하면됩니다 docker exec.

docker exec ${container_id} registry garbage-collect \ 
  /path/to/your/registry/config.yml \
  --delete-untagged=true

이 가비지 수집 바이너리 도움말을 살펴 보겠습니다.

Usage: 
  registry garbage-collect <config> [flags]
Flags:
  -m, --delete-untagged=false: delete manifests that are not currently referenced via tag
  -d, --dry-run=false: do everything except remove the blobs
  -h, --help=false: help for garbage-collect

github PR을 볼 수 있습니다 . 2018-02-23 기준 으로 distribution/registry, 태그 와 병합되어 사용할 수 master있습니다. docker/docker-registry보안 및 성능에 중점을 둔 새로운 API 디자인으로 프로젝트를 대체합니다 .

오늘이 기능을 사용하여 레지스트리 공간의 89 %를 복구했습니다 (5.7GB 대 55GB). 그런 다음 안정으로 다시 전환했습니다 registry.


There is some discussion happening to design this - right now, there is no layer cleanup tool / endpoint.

I would encourage you to go to:

and/or reach out on Freenode IRC on #docker-distribution for more.


I pieced together various parts of this thread and created an easy to use cleanup script in bash You can check it out in this gist cleanup.sh


I was looking for the same functionality in the registry v2 api but only found soft deleting which is not what I was looking for. While researching I found the Github project delete-docker-registry-image which removes the actual files from the mounted volume via a bash script. Not tested it maybe useful...


I host regestry in docker container with name docker-registry_registry_1 from image: registry:2

I just run garbage-collect with -m

docker exec docker-registry_registry_1 bin/registry garbage-collect /etc/docker/registry/config.yml -m

ReferenceURL : https://stackoverflow.com/questions/29802202/docker-registry-2-0-how-to-delete-unused-images

반응형