79

プライベート Docker レジストリを公式のレジストリ 2.0 に更新しました。このバージョンでは、ハッシュタグで識別された docker イメージを削除できるようになりました ( https://docs.docker.com/registry/spec/api/#deleting-an-imageを参照) が、古いイメージをクリーンアップする方法がまだわかりません。

CI サーバーは継続的に新しいイメージを生成しているため、名前付きタグで識別されなくなったすべてのイメージをプライベート レジストリから削除する方法が必要です。

これを実現する組み込みの方法がない場合、カスタム スクリプトが機能する可能性があると思いますが、保存されている画像のすべてのハッシュタグを一覧表示する v2 API メソッドも表示されません。

非公開レジストリをクリーンに保つにはどうすればよいですか? ヒントはありますか?

4

8 に答える 8

59

イメージの削除 (CI で行っているように、10 個の最新バージョンを保持できます) は、次の 3 つの手順で行われます。

  1. 環境変数REGISTRY_STORAGE_DELETE_ENABLED: "true"を設定して docker-registry に渡すことで、イメージの削除を有効にします

  2. 以下のスクリプトを実行します (すべての画像とタグが削除されますが、最後の 10 バージョンは保持されます)。

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

  3. ガベージ コレクションを実行します (毎日の cron タスクに組み込むことができます)。

    docker-compose -f [path_to_your_docker_compose_file] レジストリ ビン/レジストリ ガベージコレクト /etc/docker/registry/config.yml を実行

registry.py は以下のリンクからダウンロードできます。また、イメージ、タグ、レイヤーを一覧表示したり、特定のイメージやタグを削除したりできます。

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

ガベージ コレクションの前は、私のレジストリ フォルダーは 7 Gb でしたが、上記の手順を実行した後、1 Gb まで収縮しました。

于 2016-10-15T05:32:01.297 に答える
21

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

于 2016-06-09T03:28:04.963 に答える
7

これを設計するためにいくつかの議論が行われています - 現在、レイヤーのクリーンアップ ツール/エンドポイントはありません。

次の場所に行くことをお勧めします。

および/または #docker-distribution の Freenode IRC で詳細を確認してください。

于 2015-04-22T19:11:45.070 に答える
3

レジストリ v2 api で同じ機能を探していましたが、探していたものではないソフト削除しか見つかりませんでした。調査中に、bash スクリプトを介してマウントされたボリュームから実際のファイルを削除する Github プロジェクトdelete-docker-registry-imageを見つけました。テストされていないので、役に立つかもしれません...

于 2016-04-03T19:19:26.503 に答える