私はdocker registry v1を使用していて、新しいバージョンv2への移行に興味があります。しかし、レジストリに存在する画像のリストを取得する方法が必要です。例えばレジストリv1では、http://myregistry:5000/v1/search?
に対してGETリクエストを実行することができ、その結果は以下のようになります。
{
"num_results": 2,
"query": "",
"results": [
{
"description": "",
"name": "deis/router"
},
{
"description": "",
"name": "deis/database"
}
]
}
しかし、私は 公式のドキュメント レジストリにイメージのリストを取得するのに似たようなものを見つけることができません。誰もが新しいバージョンv2でそれをする方法を知っていますか?
Registry 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"]}
あなたが検索することができます
http://
<ip/hostname>
:<port>
/v2/_catalog
デフォルトでは、レジストリapiはカタログの100エントリを返します、 code があります。
あなたがレジストリ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つの方法で実行できます。
First:より大きな数を与える
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要素はこのリクエストの最後のエントリを持っています、そして次の 'page'をリクエストすることができます。
curl --cacert domain.crt https://your.registry:5000/v2/_catalog?last=pro-octopus-ws
応答ヘッダにlink要素が含まれている場合は、それをloopで行うことができます。
Catalogの結果を取得すると、次のようになります。
{ "repositories": [ "busybox", "ceph/mds" ] }
あなたはすべてのカタログで画像を得ることができます:
curl --cacert domain.crt https://your.registry:5000/v2/busybox/tags/list
以下を返します。
{"name":"busybox","tags":["latest"]}
https://github.com/docker/distribution から入手できるDocker Registryの最新バージョンはCatalog APIをサポートします。 (v2/_catalog)これにより、リポジトリを検索することができます。
興味があれば、新しいDocker Registryディストリビューションの 検索機能 を使いやすくするために私が構築したdocker image registry CLIを試すことができます( https://github.com/vivekjuneja/docker_registry_cli )
これは私を夢中にさせてきました、しかし私はついにすべての部分をまとめました。 2015年1月25日の時点で、私はdocker V2レジストリに画像をリストすることが可能であることを確認しました(上記の@jonatanとまったく同じです)。
担当者がいたら、私はその回答を支持するでしょう。
代わりに、私は答えを詳しく説明します。レジストリV2はセキュリティを念頭に置いて作られているので、 https呼び出しを可能にするために_(自己署名したcert を使って設定する)および そのcert を使ってコンテナを実行する)方法を含めるのが適切だと思います。その証明書でそれを作った:
これは、レジストリを起動するために私が実際に使用するスクリプトです。
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
(上記のとおり)は、生成された証明書に与えられたドメインと一致しなければなりません。
@ jonathanの回答 下記 、またはここのレジストリAPIドキュメントを参照してください。 https://docs.docker.com/registry/spec/api/
"listing"を検索すると、サポートがバージョンe
で追加されたことがわかります。
私たちはこの目的のためにCLIツールを書きました: docker-ls それはあなたがdockerレジストリを閲覧することを可能にし、トークンまたは基本認証による認証をサポートします。
レジストリのインストール:2.1.1以降(最後のもの、 ここ を確認できます)にGET/v2/_catalogを使ってリストを取得します。
https://github.com/docker/distribution/blob/master/docs/spec/api.md#listing-repositories
シェルスクリプトの例ですべての画像を一覧表示する: https://Gist.github.com/OndrejP/a2386d08e5308b0776c0
これは、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
「/ v2/_catalog」および「/ tags/list」エンドポイントを使用すると、すべての画像を実際にリストすることはできません。いくつかの異なる画像をプッシュして「最新」のタグを付けた場合、実際には古い画像をリストすることはできません!ダイジェスト「docker pull ubuntu @ sha256:ac13c5d2 ...」を使用してそれらを参照する場合、それらをプルできます。だから答えは-同じではないタグをリストすることしかできない画像をリストする方法はありません
私はここで同じことをしなければなりませんでした、そしてそれがローカルの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
これ以上遠くにいる人がいれば。
他の人がすでに上で言ったことを取ってください。これはjsonというフォーマットのテキストファイルに答えを入れるワンライナーです。
curl "http://mydocker.registry.domain/v2/_catalog?n=2000" | jq . - > /tmp/registry.lst
これはこんな感じです
{
"repositories": [
"somerepo/somecontiner",
"somerepo_other/someothercontiner",
...
]
}
コンテナの数に合わせて `?n = xxxx 'を変更する必要があるかもしれません。
次は古いものと使われていないコンテナを自動的に削除する方法です。
現時点では、Docker検索レジストリv2の機能はサポートされていません。 2015年2月以降のディスカッションを参照してください。「レジストリ検索機能の提案#206」 https://github.com/docker/distribution/issues/206
私はあなたが見つけることができるスクリプトを書きました: https://github.com/BradleyA/Search-docker-registry-v2-script.1.0 それはきれいではありませんが、それはプライベートレジストリから必要な情報を取得します。
使いやすいコマンドラインツールを書きました さまざまな方法で画像を一覧表示するために(これらの画像のすべてのタグを一覧表示する、それらのタグのすべてのレイヤを一覧表示するなど).
未使用のイメージをさまざまな方法で削除することもできます。たとえば、単一のイメージの古いタグのみを削除したり、すべてのイメージを削除したりすることができます。
それはpythonで書かれており、かさばる大きなカスタムレジストリイメージをダウンロードする必要はありません。
これはレジストリのすべての画像のすべてのタグを一覧表示する例です。 HTTP Basic認証用に設定されたレジストリも処理します。
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"][]'
説明:
各レジストリはコンテナとして実行されるため、コンテナIDにはログファイルID-json.logが関連付けられています。このログファイルには、vars.name = [image]とvars.reference = [tag]が含まれています。これらを外挿して印刷するためにスクリプトを使用することができます。これはおそらくレジストリV2-2.0.1にプッシュされた画像を一覧表示するための一つの方法です。