醜いですが、これは実行可能です。(私が思うに) レジストリ 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 メソッドがないためです。