プライベートDockerレジストリを公式のRegistry 2.0に更新しました。このバージョンでは、ハッシュタグ( https://docs.docker.com/registry/spec/api/#deleting-an-image を参照)で識別されるドッカーイメージを削除できるようになりましたが、まだ表示されません古い画像をクリーンアップする方法。
CIサーバーが継続的に新しいイメージを生成しているため、名前付きタグで識別されなくなったすべてのイメージをプライベートレジストリから削除する方法が必要になります。
これを実現する組み込みの方法がない場合、カスタムスクリプトはおそらく動作すると思いますが、イメージのすべての保存されたハッシュタグを一覧表示するv2 APIメソッドも表示されません。
プライベートレジストリをクリーンに保つにはどうすればよいですか?ヒントはありますか?
画像の削除(CIの場合と同様に、最新バージョンを10個保持できます)は、次の3つのステップで行われます。
環境変数REGISTRY_STORAGE_DELETE_ENABLED: "true"
を設定し、それをdocker-registryに渡すことにより、イメージの削除を有効にします
以下のスクリプトを実行します(すべての画像とタグを削除しますが、最新の10バージョンを保持します)
registry.py -l user:pass -r https://example.com:50 --delete --num 10
ガベージコレクションを実行します(毎日の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にデフレートされました。
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が崩れる方法です。
あなたの質問について:
名前付きタグで識別されなくなったプライベートレジストリからすべての画像を削除する方法が必要になります
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
。
これを設計するために起こっているいくつかの議論があります-現時点では、レイヤークリーンアップツール/エンドポイントはありません。
私はあなたに行くことをお勧めします:
または、#docker-distributionのFreenode IRCで詳細を確認してください。
このスレッドのさまざまな部分をつなぎ合わせて、bashで使いやすいクリーンアップスクリプトを作成しました。このGistで確認できます cleanup.sh
レジストリv2 APIで同じ機能を探していましたが、見つかったのは soft deleted だけでした。調査中に、bashスクリプトを介してマウントされたボリュームから実際のファイルを削除するGithubプロジェクト delete-docker-registry-image を見つけました。テストされていないかもしれません...
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