Dockerレジストリv2で画像のリストを取得する方法


204

私はdocker registry v1を使用していますが、新しいバージョンv2への移行に興味があります。しかし、レジストリに存在する画像のリストを取得する方法が必要です。たとえば、レジ​​ストリv1では、GET要求を実行できhttp://myregistry:5000/v1/search?、結果は次のようになります。

{
  "num_results": 2,
  "query": "",
  "results": [
    {
      "description": "",
      "name": "deis/router"
    },
    {
      "description": "",
      "name": "deis/database"
    }
  ]
}

しかし、私は公式のドキュメントで、レジストリのイメージのリストを取得するようなものを見つけることができません。誰かが新しいバージョンv2でそれを行う方法を知っていますか?


まだ十分ではありません。画像の作成と画像のプッシュの日付が必要です。うまくいけば、以前のタグバージョンを含めたり、抑制したりできます。実際のWebインターフェースも必要ですよね?私は管理者と話している-私たちは2.0しか持っていません
Andrew Wolfe

回答:


405

レジストリV2の最新(2015-07-31現在)バージョンの場合、DockerHubからこのイメージを取得できます。

docker pull distribution/registry:master

すべてのリポジトリー(実質的にはイメージ)をリストします。

curl -X GET https://myregistry:5000/v2/_catalog
> {"repositories":["redis","ubuntu"]}

リポジトリのすべてのタグを一覧表示します。

curl -X GET https://myregistry:5000/v2/ubuntu/tags/list
> {"name":"ubuntu","tags":["14.04"]}

3
証明書はどこから入手しますか?
duality_ 2017年

3
@dualityレジストリが自己署名証明書または信頼されていないルートCAによって署名された証明書を使用している場合、安全な接続を確立するためにcurlする証明書を提供する必要があります。安全でない接続を作成するには、代わりに「--insecure」フラグを追加します。
ジョナタン2017年

5
-k、-insecure(SSL)
Ilja

9
デフォルトの結果は100枚の画像の記録を示していますが、より多くのあなたがこのクエリで結果をページ分割できることを示す必要がある場合:http://<registry-url>/v2/_catalog?n=<count>例えば、2000年のカウントで
kikicarbonell

17
レジストリがパスワード保護されている場合は、curl -u <user>:<pass> -X GET ...
nsantos

77

検索できます

http:// <ip/hostname><port>/ v2 / _catalog


4
...最近では、httpではなくhttpsが必要であることを追加したいと思います
Nikola

2
私は最近インストールしたDockerレジストリにそのような必要がないと思います!
Enok82、18年

44

カタログを入手する

デフォルトでは、レジストリAPIはカタログの100エントリを返します。 ますコードは次のとおりです

レジストリAPIをカールすると:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

それは次と同等です:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?n=100

これはページネーション方法です。

エントリの合計が100を超える場合、次の2つの方法で行うことができます。

最初に:より大きい数を与える

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?n=2000

Sencond:次のリンカーURLを解析する

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

応答ヘッダーに含まれるリンク要素:

curl --cacert domain.crt https://your.registry:5000/v2/_catalog

応答ヘッダー:

Link: </v2/_catalog?last=pro-octopus-ws&n=100>; rel="next"

link要素にはこのリクエストの最後のエントリがあり、次の「ページ」をリクエストできます。

curl --cacert domain.crt https://your.registry:5000/v2/_catalog?last=pro-octopus-ws

応答ヘッダーにリンク要素が含まれている場合は、ループで実行できます

画像を取得

カタログの結果を取得すると、次のようになります。

{ "repositories": [ "busybox", "ceph/mds" ] }

すべてのカタログの画像を取得できます。

curl --cacert domain.crt https://your.registry:5000/v2/busybox/tags/list

戻り値:

{"name":"busybox","tags":["latest"]}



2
これは受け入れられる答えになるはずです。それが恐ろしいページネーションをどうやって回避するかを説明する唯一の答えです。現在受け入れられている回答(jonatan)には、「a」で始まる画像のみが表示されます。
user2394284 2018年

どのようにタグリストを取得しますceph/mdsか?一般的に、/-で定義されたリポジトリで/v2/_catalog/ceph/mdt/tags/listは機能しません
tymik '18

25

https://github.com/docker/distributionから入手できるDocker Registryの最新バージョンは、カタログAPIをサポートしています。(v2 / _catalog)。これにより、リポジトリを検索する機能が可能になります

興味があれば、新しいDocker Registryディストリビューション(https://github.com/vivekjuneja/docker_registry_cli)の検索機能を簡単に使用できるように構築したdocker image registry CLIを試すことができます。



21

これで頭がおかしくなりましたが、ようやくすべてをまとめました。2015年1月25日の時点で、イメージをdocker V2レジストリーにリストできることを確認しました(上記の@jonatanとまったく同じです)。

担当者がいれば、私はその回答に賛成票を投じます。

代わりに、答えを詳しく説明します。レジストリV2は、セキュリティを考慮して作られているので、私はそれをする方法を含めることが適切だと思う自己署名証明書とそれを設定し、その証明書の入った容器を実行しますます。httpsコールは、その証明書とそれに行うことができるようにするために:

これは、レジストリを起動するために実際に使用するスクリプトです。

sudo docker stop registry
sudo docker rm -v registry
sudo docker run -d \
  -p 5001:5001 \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /data/registry:/var/lib/registry \
  -v /root/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \ 
  -e REGISTRY_HTTP_DEBUG_ADDR=':5001' \
  registry:2.2.1

これは一部の人には自明かもしれませんが、私は常にキーと証明書を混同しています。上記の@jonatonの呼び出しを行うために参照する必要があるファイル**は、上記のdomain.crtです。(domain.crtをに配置したので/root、アクセスできるユーザーディレクトリにコピーを作成しました。)

curl --cacert ~/domain.crt https://myregistry:5000/v2/_catalog
> {"repositories":["redis","ubuntu"]}

**上記のコマンドが変更されました:-X GETを試しても実際には機能しませんでした。

注:(https://myregistry:5000上記のように)は、生成された証明書に指定されたドメインと一致する必要があります。



7

以下は、Reposと関連するタグのリストを出力するための素敵な小さなライナー(JQを使用)です。

あなたが持っていけない場合はjqインストールされ、あなたは使用することができます。brew install jq

# This is my URL but you can use any
REPO_URL=10.230.47.94:443

curl -k -s -X GET https://$REPO_URL/v2/_catalog \
 | jq '.repositories[]' \
 | sort \
 | xargs -I _ curl -s -k -X GET https://$REPO_URL/v2/_/tags/list

ああ、私はこれを書いて、それからあなたの:Sを見つけましたが、基本的な認証の処理方法も示しており、それが機能する理由を説明しているので、私は私の答えを保持します。また、結果をフラットな画像リストにフィルターします。
クレイグリンガー

jqがLinuxディストリビューションにない場合に備えて、彼女のstedolan.github.io/jq/downloadを入手してください。 これは非常に便利な小さなツールです。
ISQ、

5

ローカルのDockerリポジトリであるため、ログインの詳細を提供する必要があることを除いて、ここでも同じことを行う必要がありました。

上記のとおりですが、URLにユーザー名/パスワードを指定します。

curl -k -X GET https://yourusername:yourpassword@theregistryURL/v2/_catalog

フォーマットされていないJSONとして返されます。

人間が読みやすくするために、Pythonフォーマッタにパイプしました。このフォーマットで使用する場合に備えてください。

curl -k -X GET https://yourusername:yourpassword@theregistryURL/v2/_catalog | python -m json.tool

4

「/ v2 / _catalog」および「/ tags / list」エンドポイントを使用すると、実際にすべてのイメージをリストすることはできません。いくつかの異なる画像をプッシュして「最新」のタグを付けた場合、古い画像を実際にリストすることはできません。ダイジェスト「docker pull ubuntu @ sha256:ac13c5d2 ...」を使用して参照すれば、引き続きプルできます。だから答えは-同じではないタグをリストすることができる画像をリストする方法はありません


3

これまでにいくつかの場合。

他の人がすでに上で述べたことを理解する。以下は、回答をフォーマットされたテキストファイルjsonに入れるワンライナーです。

curl "http://mydocker.registry.domain/v2/_catalog?n=2000" | jq . - > /tmp/registry.lst

これは

{
  "repositories": [
    "somerepo/somecontiner",
    "somerepo_other/someothercontiner",
 ...
  ]
}

所有しているコンテナの数に合わせて、 `?n = xxxx 'を変更する必要がある場合があります。

次は、古いコンテナと未使用のコンテナを自動的に削除する方法です。


2

現時点では、Docker検索レジストリv2の機能はサポートされていません。2015年2月以降の説明を参照してください:「レジストリ検索機能の提案#206」https://github.com/docker/distribution/issues/206

私はあなたが見つけることができるスクリプトを書きました:https : //github.com/BradleyA/Search-docker-registry-v2-script.1.0 きれいではありませんが、プライベートレジストリから必要な情報を取得します。


2

私が書いた、使いやすいコマンドラインツールをさまざまな方法で画像を一覧表示するために(リストのようにすべての画像を、リスト、それらの画像のすべてのタグ、リストこれらのタグのすべての層)。

また、単一のイメージの古いタグのみ、またはすべてのイメージから削除するなど、さまざまな方法で未使用のイメージを削除することもできます。これは、CIサーバーからレジストリを入力し、最新/安定したバージョンのみを保持したい場合に便利です。

それはpythonで書かれており、かさばる大きなカスタムレジストリイメージをダウンロードする必要はありません。


2

レジストリにあるすべての画像のすべてのタグを一覧表示する例を次に示します。HTTP基本認証用に構成されたレジストリも処理します。

THE_REGISTRY=localhost:5000

# Get username:password from docker configuration. You could
# inject these some other way instead if you wanted.
CREDS=$(jq -r ".[\"auths\"][\"$THE_REGISTRY\"][\"auth\"]" .docker/config.json | base64 -d)

curl -s --user $CREDS https://$THE_REGISTRY/v2/_catalog | \
    jq -r '.["repositories"][]' | \
    xargs -I @REPO@ curl -s --user $CREDS https://$THE_REGISTRY/v2/@REPO@/tags/list | \
    jq -M '.["name"] + ":" + .["tags"][]'

説明:

  • .docker / config.jsonからユーザー名:パスワードを抽出します
  • レジストリにhttpsリクエストを送信して、すべての「リポジトリ」を一覧表示します
  • jsonの結果をフィルタリングして、リポジトリ名のフラットリストに
  • 各リポジトリ名:
  • レジストリにhttpsリクエストを送信して、その「リポジトリ」のすべての「タグ」をリストします
  • 結果のJSONオブジェクトのストリームをフィルタリングし、各リポジトリで見つかった各タグの「リポジトリ」:「タグ」のペアを出力します

1

このスレッドは古くからあり、考慮すべき最新のツールはskopeoおよびcraneです。

skopeoは署名をサポートし、他の多くの機能を備えていますcraneが、もう少しミニマルであり、単純なシェルスクリプトに統合する方が簡単であることがわかりました。


0

各レジストリはコンテナとして実行されるため、コンテナIDには関連するログファイルID-json.logがあり、このログファイルにはvars.name = [image]およびvars.reference = [tag]が含まれています。スクリプトを使用して、これらを推定して印刷できます。これは、おそらくレジストリV2-2.0.1にプッシュされたイメージを一覧表示する1つの方法です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.