Dockerはプライベートライブラリイメージを完全に削除します

Dockerはプライベートライブラリイメージを完全に削除します

まず、インターネット上の一般的な慣行を見てみましょう

デフォルトでは、プライベート ライブラリはイメージの削除をサポートしていません。config.yml 構成ファイルを変更し、ストレージ ノードの下に delete: enabled: true を追加してから、プライベート ライブラリを再起動する必要があります。

Docker が提供するイメージ削除 API は次のとおりです。

ip:port/v2/<リポジトリ>/manifests/<参照> を削除します。

リポジトリはミラー化されたリポジトリです

参照は、イメージが正常にプッシュされた後に生成されたダイジェストです: sha256値

ダイジェストを取得:

curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -XGET <プライベート ライブラリ IP>:ポート番号/v2/<イメージ リポジトリ>/manifests/<イメージ タグ>

知らせ:

--header "Accept: application/vnd.docker.distribution.manifest.v2+json" このヘッダーを追加する必要があります。追加しないと、Content-Type は v1+prettyjws になり、取得されたダイジェストが間違っています。 !

例:

curl --header "受け入れ: application/vnd.docker.distribution.manifest.v2+json" -I -XGET 192.168.120.107:5000/v2/my-registry/manifests/1.0

画像を削除するには:

例:

curl -I -X DELETE http://192.168.120.107:5000/v2/my-repository/manifests/sha256:4d523adb3c653bab7dfd0326081860b3cba24dc393f69d6731daa513c435ec0c

削除後、プライベートライブラリを確認してみましょう

カール 192.168.120.107:5000/ v2/my-repository/tags/list

削除したタグが消えていることがわかります。しかし、コマンド実行前と実行後のガレージ内のプライベートライブラリイメージ保存ディレクトリのファイルサイズを確認すると、あまり変化がないことがわかります。

当然ながら、データは実際には削除されないため、Docker が提供するガベージ コレクション コマンドを実行する必要があります。

ガベージコレクション

プライベート ライブラリが配置されているサーバーにログインし、次のコマンドを実行する必要があります。

docker exec -it <プライベートライブラリのコンテナIDまたはコンテナ名> sh -c 'registry garbage-collect /etc/docker/registry/config.yml'

もちろん、プライベート ライブラリのコンテナーに入って次のコマンドを実行することもできます。

docker exec -it <プライベートライブラリのコンテナIDまたはコンテナ名> sh
レジストリガベージコレクション /etc/docker/registry/config.yml

この方法は非常に面倒です。タグは削除できますが、リポジトリは削除できません。削除後、blobs ディレクトリに多くの空のフォルダーが残ります。さらに、リポジトリに複数のタグがあり、これらのタグのデータが同じである場合、1 つのタグを削除すると、すべてのタグが同時に削除されます。

インターネット上にはプライベートライブラリイメージを削除するための Python スクリプトがありますが、使いやすいとは思えません。

これでは満足できないので、まずは効果を確認するために自分で sh スクリプトを書きました。

このスクリプトにはユーザーフレンドリーなプロンプトもいくつかあり、sh スクリプトは理解しやすく拡張も簡単です。このスクリプトは gitHub にもアップロードしました。ご興味があればダウンロードして試してみてください。

gitHubアドレス: https://github.com/hushuai86/docker-delete

ダウンロードして実行:

#まずスクリプトを /usr/local/bin/ ディレクトリにダウンロードします curl https://raw.githubusercontent.com/hushuai86/docker-delete/master/docker-delete-2.0.sh | sudo tee /usr/local/bin/docker-delete >/dev/null

#実行権限を与える chmod a+x /usr/local/bin/docker-delete

#プライベート ライブラリ イメージ ストレージ ディレクトリ パス グローバル環境変数 (このパスは、プライベート ライブラリ コンテナを実行するときに -v コマンドを使用して、プライベート ライブラリ コンテナ内の /var/lib/registry ディレクトリをローカル マシンにマウントするパスです) #例: /opt/data/registry は、コンテナを実行するときにプライベート ライブラリ イメージ ストレージ ディレクトリがローカル マシンにマウントされるディレクトリです echo "export DOCKER_REGISTRY_DIR=/opt/data/registry" >>/etc/profile

#プライベート ライブラリ コンテナ ID グローバル環境変数設定を実行します (実行中のプライベート ライブラリ コンテナの ID) #例: 89b9b3c9054ay は私のプライベート ライブラリ コンテナの ID です echo "export DOCKER_REGISTRY_CONTAINER_ID=89b9b3c9054a" >>/etc/profile

#設定を有効にするsource /etc/profile

その後、docker-delete コマンドを使用できます。スクリプトに不安がある場合は、スクリプトを編集して自分で変更することもできます。

原則分析:

(次のスクリーンショットでは、/opt/data/registry は、コンテナを実行したときにプライベート ライブラリ イメージ ストレージ ディレクトリがローカル ディレクトリにマウントされるディレクトリです)

プライベートライブラリイメージストレージディレクトリの下には、blobsとrepositoriesの2つのフォルダがあります。

リポジトリ ディレクトリには、ミラー リポジトリにちなんで名付けられたいくつかのファイルが含まれています。

つまり、プライベート ライブラリにどのような画像が含まれているかを知りたい場合は、このフォルダー内のサブフォルダーを確認するだけです。

各イメージリポジトリフォルダ/_m​​anifests/tagsディレクトリでは、イメージにどのタグが付いているか確認できます。

ただし、イメージの実データはリポジトリディレクトリには存在せず、データブロックの形でblobsディレクトリに保存されます。イメージは複数のデータブロックに分割されており、これはガベージコレクションコマンドを実行したときに出力される「marking blob ...」のような関連付け関係です。イメージとデータブロックの関連付けは、repositories/mirrorrepository/_manifests/revisions/sha256/ディレクトリ内のsha256値です。

sha256値にちなんで名付けられたディレクトリにはリンクファイルがあり、その内容はこのsha256値です

テストの結果、このリンク ファイルが削除され、プライベート ライブラリ コンテナーでガベージ コレクション コマンド「registry garbage-collect /etc/docker/registry/config.yml」が実行されると、この sha256 値に関連付けられた BLOB が完全に削除されることがわかりました。

ただし、画像には多くのタグが付いている場合があり、この sha256 値に関連付けられた BLOB データはどのタグに属するのでしょうか?

イメージの tag/index/sha256/ ディレクトリに移動すると、sha256 値にちなんで名付けられたフォルダーが見つかります。この sha256 値は、以前のリビジョン/sha256/ の下に存在します。このフォルダーには、sha256 値を保存するリンク ファイルもあります。

したがって、私の理解によれば、docker が提供する API を呼び出してタグを削除すると、このイメージの tag/index/sha256/<sha256 value>/link ファイル内の sha256 値が取得され、この sha256 値に関連付けられている他のタグがあるかどうかが確認されます。ある場合は、このタグ フォルダーのみを削除します。そうでない場合は、タグ ファイルを削除すると、revisions/sha256/ ディレクトリ内の変更された sha256 に対応するリンク ファイルも削除されます。このようにして、コンテナ内でガベージ コレクション コマンドを実行すると、sha256 値に関連付けられた BLOB データが完全に削除されます。

特記事項:

イメージのデータを完全に削除した後は、プライベートライブラリコンテナを再起動する必要があります。再起動しないと、再度プライベートライブラリにイメージをプッシュすると必ず「レイヤーが既に存在します」と出力され、プッシュアップされているように見えますが、ローカルイメージを削除してから再度プルするとエラーになります。

もちろん、私が書いたスクリプトにはこのステップがあります

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。

以下もご興味があるかもしれません:
  • docker pull imageエラーの問題を解決する
  • Alpine Dockerイメージフォント問題解決操作
  • Docker が MySQL イメージをプルするのが遅すぎる問題を解決する
  • Dockerコンテナイメージからコードを復元する手順
  • Dockerイメージを完全にアンインストールする手順
  • Dockerイメージ内のnoneイメージ操作を削除する

<<:  Mysql クエリの結果セットを JSON データに変換するサンプル コード

>>:  セマンティックウェブページ XHTML セマンティックマークアップ

推薦する

ウェブサイトのBGM実装方法

個々のウェブマスターにとって、自分のウェブサイトをいかにユニークで個性あふれるものにするかは、常に絶...

HTML ページ適応幅テーブル

WEB アプリケーションのページでは、テーブルがよく使用されます。列の数が限られているため、各列のコ...

リモートホスト上でスクリプトや命令を実行する Zabbix の詳細な説明

シナリオ要件1. zabbix_server Web インターフェースのスクリプト機能を使用すると、...

MySQL 5.7 における基本的な JSON 操作ガイド

序文プロジェクトのニーズにより、ストレージ フィールドは JSON 形式で保存されます。プロジェクト...

Ubuntu 19.10 で ssh サービスを有効にする (詳細なプロセス)

Ubuntuでsshを開くのに1時間以上かかりました。主な原因は、最初に読んだチュートリアルの手順...

MySql データ型チュートリアル例の詳細な説明

目次1. 概要2. MySQLデータ型の詳細な説明1) 文字列型2) 整数型3) 浮動小数点型4) ...

Windows 8.1 で MySQL5.7 のルート パスワードを忘れた場合の解決方法

【背景】最近勉強中に非常に恥ずかしいことに遭遇しました。MySQL のパスワードを忘れてしまい、My...

VUE と Canvas を使用して Thunder Fighter タイピング ゲームを実装する方法

今日は、サンダーファイタータイピングゲームを実装します。ゲームプレイは非常に簡単です。それぞれの「敵...

Vueは動的クエリルール生成コンポーネントを実装します

1. 動的クエリルール動的クエリルールは、おおよそ次の図のようになります。ユーザのカスタマイズに応じ...

select @@session.tx_read_only が DB に大量に出現するのはなぜですか?

問題を見つける上位の SQL ステートメントを取得すると、DB が大量のselect @@sessi...

円形グラデーションプログレスバー効果を実現する CSS サンプルコード

実装のアイデア一番外側は大きな円(グラデーションカラー)グラデーションの円を覆うように、内側に半円を...

ログインボックスのドラッグ効果を実現するためのJavascript

この記事では、ログインボックスのドラッグ効果を実現するためのJavascriptの具体的なコードを参...

MySQL マスタースレーブ遅延問題の解決方法

今日は、マスタースレーブ遅延が発生する理由とその対処方法について説明します。しっかり座って出発の準備...

近々ブラウザに導入される CSS :is() と :where() の簡単な分析

Safari (Technology Preview 106) および Firefox (バージョン...

初心者向けMySQLシリーズチュートリアル

目次1. 基本概念と基本コマンド1) 基本的な概念2) 基本コマンド2. SQL文の記述順序と実行順...