1. ホーム

[解決済み】プライベートDockerレジストリからイメージを削除する方法は?

2022-04-08 10:08:15

質問

私はプライベートな docker レジストリを運用しています。 latest をリポジトリから削除します。リポジトリ全体を削除するのではなく、その中にあるイメージの一部だけを削除したいのです。その API ドキュメント は、この方法について言及していませんが、きっと可能なのでしょう?

解決方法は?

現在、そのタスクにレジストリ API を使用することはできません。リポジトリや特定のタグを削除することだけが可能です。

一般に、リポジトリを削除すると、このリポジトリに関連するすべてのタグが削除されます。

タグの削除は、画像とタグの関連付けを削除することを意味します。

上記のいずれでも、画像は1枚も削除されません。ディスクに残ります。


ワークアラウンド

この回避策では、Dockerイメージをローカルに保存しておく必要があります。

あなたのソリューションに対する回避策は、最新のタグ以外をすべて削除し、それによって関連する画像への参照を削除する可能性があります。その後 このスクリプト を実行すると、どのタグからも参照されていない画像や、使用されている画像の祖先でない画像をすべて削除することができます。

用語解説(画像とタグ)

このようなイメージグラフを考えてみると、大文字の( A , B は短い画像IDを表し <- は、ある画像が他の画像に基づいたものであることを意味する。

 A <- B <- C <- D

ここで、画像にタグを追加します。

 A <- B <- C <- D
           |    |
           |    <version2>
           <version1>

ここで、タグ <version1> は画像を参照しています。 C というタグと <version2> は画像を参照しています。 D .

質問の絞り込み

ご質問の中で、「削除したい」とおっしゃいました。

を除くすべての画像は latest

. さて、この用語は全く正しくありません。画像とタグが混在していますね。グラフを見ると、タグが <version2> は最新バージョンを表しています。実際には この質問 を使えば、最新版を表すタグを持つことができます。

 A <- B <- C <- D
           |    |
           |    <version2>
           |    <latest>
           <version1>

というのは <latest> タグは画像を参照する D 質問:本当に画像以外を削除したいのですか? D ? おそらく、そうではないでしょう。

タグを削除するとどうなりますか?

タグを削除した場合 <version1> をDocker REST APIで使用すると、このようになります。

 A <- B <- C <- D
                |
                <version2>
                <latest>

忘れないでください。 Dockerは決してイメージを削除しません! 仮に削除されたとしても、この場合、イメージは削除されません。 C の祖先の一部です。 D というタグが付けられています。

を使用した場合でも このスクリプト の場合、画像が削除されることはありません。

画像の削除が可能な場合

誰かがあなたのレジストリにプルまたはプッシュできるタイミングを制御できる条件下で (たとえば REST インターフェイスを無効にすることで)。イメージグラフから画像を削除できるのは、その画像を元にしている画像がなく、その画像を参照しているタグもない場合です。

次のグラフで、画像 D ではない に基づいて C でなく B . したがって D には依存しません。 C . タグを削除すると <version1> このグラフの場合、画像 C はどの画像にも使われず このスクリプト は削除することができます。

 A <- B <--------- D
      \            |
       \           <version2>
        \          <latest>
         \ <- C
              |
              <version1>

クリーンアップ後のイメージグラフは次のようになります。

 A <- B <- D
           |
           <version2>
           <latest>

これでいいのか?