개인 레지스트리에서 태그가 지정된 Docker 이미지 제거


10

개인 Docker 레지스트리의 이미지에서 실수로 추가 된 태그를 어떻게 삭제합니까? Docker 1.9.1의 원격 이미지에는 -rmi 옵션이 작동하지 않는 것 같습니다.

user@ubuntu-user:~$ docker --version  
Docker version 1.9.1, build a34a1d5

user@ubuntu-user:~$ docker search myregistry:5000/user/image
NAME                                                                     
myregistry:5000/user/image:20160119                                         
myregistry:5000/user/image:20160119-20160120        

user@ubuntu-user:~$ docker rmi myregistry:5000/user/image:20160119-20160120
Error response from daemon: could not find image: no such id: myregistry:5000/user/image:20160119-20160120
Error: failed to remove images: [myregistry:5000/user/image:20160119-20160120]

답변:


9

오늘날 레지스트리에서 이미지를 제거하는 간단한 방법은 없으며 레지스트리 2.1 이정표 의 기능처럼 보입니다 .

작동하지 않는 오늘의 옵션 중 하나

anovil@ubuntu-anovil remove-registry]$ curl -X DELETE localhost:5000/v2/alpine/manifests/v1
{"errors":[{"code":"UNSUPPORTED","message":"The operation is unsupported."}]}
[anovil@ubuntu-anovil remove-registry]$ 

레지스트리 자체에서 수동으로 제거하는 것입니다. 실수로 잘못된 파일을 제거하지 않기 위해 github에서이 스크립트로 테스트했습니다 . 이 스크립트의 작동 방식에 대해서는 보증하지 않습니다 (테스트하기 전에 빠르게 확인했지만).

그래서, 나는 테스트를했고 그것은 효과가있는 것 같습니다 :)

[1] 나는 당신이 docker 자체로 레지스트리를 실행하고 있다고 가정합니다.

[anovil@ubuntu-anovil remove-registry]$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
88f8e1a1d7a7        registry:2          "/bin/registry /etc/d"   37 minutes ago      Up 37 minutes       0.0.0.0:5000->5000/tcp   registry
[anovil@ubuntu-anovil remove-registry]$ 

[2] FROM alpine내용 만으로 최소한의 Dockerfile을 만들고 alpine : v1을 만들고 localhost : 5000에서 실행되는 개인 레지스트리로 푸시했습니다. 레지스트리에서 쿼리하면 예상대로 반환됩니다.

[anovil@ubuntu-anovil remove-registry]$ curl -X GET localhost:5000/v2/alpine/tags/list
{"name":"alpine","tags":["v1"]}
[anovil@ubuntu-anovil remove-registry]$ 

[3] 그런 다음 docker exec실험을 시작하기 전에 레지스트리에 로그인 하고 디스크 사용량을 확인했습니다.

root@88f8e1a1d7a7:/# du -sch /var/lib/registry/                     
2.5M    /var/lib/registry/
2.5M    total
root@88f8e1a1d7a7:/# 

[4] 호스트로 돌아가서 무거운 파일 (mongodb.tgz)을 컨테이너에 복사하고 빌드 및 푸시 버전 v2를 만들었습니다.

[anovil@ubuntu-anovil remove-registry]$ docker build -t localhost:5000/alpine:v2 .
Sending build context to Docker daemon 61.99 MB
Step 1 : FROM alpine
 ---> 2314ad3eeb90
Step 2 : COPY mongodb.tgz /mongodb.tgz
 ---> d7c7645a3fe2
Successfully built d7c7645a3fe2
[anovil@ubuntu-anovil remove-registry]$ docker push localhost:5000/alpine:v2
The push refers to a repository [localhost:5000/alpine] (len: 1)
d7c7645a3fe2: Pushed 
5ff05309724e: Image already exists 
v2: digest: sha256:7bea1ec2910170bd88412b622aee6129791673cf1fd8c0e1e34f15ec26428774 size: 4467
[anovil@ubuntu-anovil remove-registry]$ 

[5] 레지스트리에서 크기를 다시 확인한 후 62MB로 증가했습니다.

root@88f8e1a1d7a7:/# du -sch /var/lib/registry/                                                                               
62M /var/lib/registry/
62M total
root@88f8e1a1d7a7:/# 

[6]을 실행 delete_docker_registry_image하려면 레지스트리를 호스팅하는 컨테이너에 스크립트를 가져와야합니다.이를 수행하는 한 가지 옵션은 curl을 사용하는 것입니다. 또한이 스크립트에는가 필요합니다 jq.

root@88f8e1a1d7a7:/# apt-get update && apt-get install -y curl jq
...
root@88f8e1a1d7a7:/#

[7] 스크립트를 실행하고, --dry-run먼저 옵션으로 시도 하고 버전 태그 (이 경우 v2)를 잊지 마십시오.-h

root@88f8e1a1d7a7:/# delete_docker_registry_image --image alpine:v2 --dry-run
DRY_RUN: would have deleted tag directory: repositories/alpine/_manifests/tags/v2
DRY_RUN: would have deleted manifest revision: repositories/alpine/_manifests/revisions/sha256/7bea1ec2910170bd88412b622aee6129791673cf1fd8c0e1e34f15ec26428774
DRY_RUN: would have deleted directory: blobs/sha256/e2/e2cc9aed084e01fa5cf93c09121035ac4d712113425ae68b678c28591beec5c6
DRY_RUN: would have deleted directory: blobs/sha256/7a/7ada67971e952e353ab14d8f9bdd4e41e4c41099b05a5da09f2700b51d93908a
DRY_RUN: would have deleted directory: blobs/sha256/7b/7bea1ec2910170bd88412b622aee6129791673cf1fd8c0e1e34f15ec26428774
DRY_RUN: would have deleted layer metadata directory: repositories/alpine/_layers/sha256/e2cc9aed084e01fa5cf93c09121035ac4d712113425ae68b678c28591beec5c6
root@88f8e1a1d7a7:/# delete_docker_registry_image --image alpine:v2          
root@88f8e1a1d7a7:/#

[8] 그리고 짜잔!

root@88f8e1a1d7a7:/# du -sch /var/lib/registry/                     
2.5M    /var/lib/registry/
2.5M    total
root@88f8e1a1d7a7:/#  


0

최근 에이 문제에 직면했지만 삭제 한 이유는 이전 버전을 다시 릴리스 할 것이라고 생각했습니다.

docker push my/image:1.0.0
docker push my/image:1.0.1 # This is broken

docker tag  my/image:1.0.0 my/image:1.0.2
docker push my/image:1.0.2

깨진 이미지는 여전히 존재하지만 "최신"버전이 있으므로 다른 사람이 사용하지 않을 것입니다. 분명히 앞으로 고치는 것이 낫지 만 조금이라도 빠른 해결책입니다.

삭제하려는 이유에 비밀이나 노출 된 것이 있기 때문에 다른 해결책이 더 나을 수도 있지만, 현재 알려진 것으로 가정하고 변경하십시오 (암호, 키 등).


1
따라서 더 많은 이미지가 밀려나 퍼지되지 않으면 서 필요한 저장 공간이 커지고 커집니다.
emmdee

@emmdee 잘 그렇습니다 ...하지만 디스크 단위로 git과 마찬가지로 개정판 사이의 델타 만 저장한다는 것을 기억하십시오. 1GB로 끝나는 이미지의 경우 새 버전을 출시 할 때마다 디스크에서 다른 1GB가 사용되는 것은 아닙니다.
마이클 버틀러
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.