Docker Registry 2.0-사용하지 않는 이미지를 삭제하는 방법은 무엇입니까?
개인 도커 레지스트리를 공식 레지스트리 2.0으로 업데이트했습니다. 이 버전은 이제 해시 태그로 식별 된 도커 이미지를 삭제할 수 있지만 ( https://docs.docker.com/registry/spec/api/#deleting-an-image 참조 ) 여전히 오래된 이미지를 정리하는 방법을 볼 수 없습니다.
CI 서버가 지속적으로 새 이미지를 생성하므로 더 이상 명명 된 태그로 식별되지 않는 개인 레지스트리에서 모든 이미지를 삭제하는 방법이 필요합니다.
이 작업을 수행하는 기본 제공 방법이없는 경우 사용자 지정 스크립트가 작동 할 수 있다고 생각하지만 이미지의 저장된 해시 태그를 모두 나열하는 v2 API 메서드도 보이지 않습니다.
개인 레지스트리를 깨끗하게 유지하려면 어떻게해야합니까? 힌트가 있습니까?
이미지 삭제 (내 CI에서와 같이 마지막 버전 10 개를 유지할 수 있음)는 세 단계로 수행됩니다.
환경 변수를 설정
REGISTRY_STORAGE_DELETE_ENABLED: "true"
하고 docker-registry에 전달 하여 이미지 삭제를 활성화합니다.아래 스크립트 실행 (모든 이미지와 태그는 삭제되지만 마지막 10 개 버전은 유지됨)
registry.py -l 사용자 : pass -r https://example.com:5000 --delete --num 10
가비지 수집 실행 (일일 크론 작업에 넣을 수 있음)
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=True
env 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
'IT이야기' 카테고리의 다른 글
Git (Hub)는 짧은 SHA에서 발생할 수 있는 충돌 처리 (0) | 2021.04.02 |
---|---|
GitHub 풀 요청을 위해 모든 커밋을 하나로 스쿼시 (0) | 2021.04.02 |
kubernetes 포드의 모든 컨테이너 깔끔하게 나열하는 방법 (0) | 2021.04.01 |
Rust에서 문자열의 첫 글자를 대문자로 바꾸는 이유 (0) | 2021.04.01 |
기본 SSH 키 위치 설정 (0) | 2021.04.01 |