web-dev-qa-db-ja.com

タグ付けされたDockerイメージをプライベートレジストリから削除する

プライベートDockerレジストリのイメージから誤って追加されたタグを削除するにはどうすればよいですか?オプション-rmiは、Docker 1.9.1のリモートイメージに対しては機能しないようです。

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]
10
user3105453

現在のところ、レジストリから画像を削除する簡単な方法はないようで、レジストリの機能 2.1マイルストーン のように見えます。

これが機能しない今日の選択肢の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を実行するには、レジストリをホストしているコンテナにスクリプトを取得する必要があります。これを行う1つのオプションは、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:/#  
9
Maniankara

つい最近、私自身もこれに遭遇しましたが、なぜ削除するのかを考え、古いバージョンを再リリースします。

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

壊れた画像はそのまま残りますが、「新しい」バージョンが利用できるため、だれもそれを使用することはほとんどありません。明らかに前方に修正する方が良いですが、ピンチではこれは高速なソリューションです。

削除したい理由が、シークレットまたは公開したくない何かが公開されているためである場合、他のソリューションの方が優れていますが、現在わかっているものを想定し、それを変更します(パスワード、キーなど)。

0
DanielM

これが役立つかどうかはわかりません。しかし、ここで私の提案を見てください(mphanikumarsからのコメント)

https://github.com/docker/docker-registry/issues/988

0
Phani Kumar