web-dev-qa-db-ja.com

Docker Registry 2.0-未使用の画像を削除する方法は?

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

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

これを実現する組み込みの方法がない場合、カスタムスクリプトはおそらく動作すると思いますが、イメージのすべての保存されたハッシュタグを一覧表示するv2 APIメソッドも表示されません。

プライベートレジストリをクリーンに保つにはどうすればよいですか?ヒントはありますか?

53
Kristof Jozsa

画像の削除(CIの場合と同様に、最新バージョンを10個保持できます)は、次の3つのステップで行われます。

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

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

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

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

    docker-compose -f [path_to_your_docker_compose_file] run bin/registry garbage-collect /etc/docker/registry/config.ymlレジストリ

registry.pyは、以下のリンクからダウンロードできます。また、特定の画像やタグを削除するだけでなく、画像、タグ、レイヤーを一覧表示することもできます。

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

ガベージコレクション前は、レジストリフォルダーは7 Gbでしたが、上記の手順を実行すると、1 Gbにデフレートされました。

46
anoxis

Thisいですが、これは実行可能です。 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つのダイジェストを除くすべてをリストします。あるいは、tagsをあまり気にせず、最後のいくつかの参照をプッシュしたい場合は、次のようにできます。

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を実行する必要があります。レジストリは実際にはdelete何もしない「ソフト削除」を実装するため、使用できなくなります。

docker exec docker-registry /bin/registry \
  garbage-collect /path/to/config.yml

はい、これはすべてバックグラウンドストレージでうろついて面倒です。特定のタグに関連付けられたすべてのダイジェストを列挙するAPIメソッドはありませんが、これはCookieが崩れる方法です。

19
womble

あなたの質問について:

名前付きタグで識別されなくなったプライベートレジストリからすべての画像を削除する方法が必要になります

distribution/registry:master のdockerレジストリの新しいバージョンには、この素晴らしい機能があります!ただし、は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.7 GB対55 GB)。その後、安定した状態に戻りました registry

15

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

私はあなたに行くことをお勧めします:

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

6
Mangled Deutz

このスレッドのさまざまな部分をつなぎ合わせて、bashで使いやすいクリーンアップスクリプトを作成しました。このGistで確認できます cleanup.sh

4
Paul Robello

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

3
Endian Ogino

I docker-registry_registry_1からimage: registry:2という名前のdockerコンテナにレジストリをホストします

garbage-collect-mを実行します

docker exec docker-registry_registry_1 bin/registry garbage-collect /etc/docker/registry/config.yml -m