Docker Registry API – 列出圖像和標籤
一、概述
在本教程中,我們將探討如何在遠程 Docker 註冊表中列出圖像以及如何獲取圖像的標籤。
這對於找出註冊表中可用的特定映像版本並決定使用哪個版本很有用。
2. Docker 註冊表 API
Docker 註冊表提供了一個 API 來與註冊表交互。此API 包含 Docker CLI 在後台使用的各種端點,用於執行各種任務,例如拉取、推送和標記圖像。
我們還可以直接使用這些端點與註冊表交互,而無需使用 Docker CLI。
讓我們看一下註冊表 API 的端點的格式:
/<api-version>/<repository-name>/<resource>/<params>
讓我們檢查一下這個端點的不同組件:
- API 版本– API 的版本。例如,當前版本是 v2
.
- 存儲庫(圖像)名稱–圖像的名稱。如果它是嵌套存儲庫,該名稱還可以包含由斜杠分隔的路徑。例如,
/ubuntu/nginx
或/redis
。 - 資源——我們要與之交互的 API 的細分。例如,
manifests
將與特定圖像的清單一起使用。 - 參數——這些是可用於進一步細化操作的可選參數。例如,
manifests/latest
將獲取最新標籤的清單。
基於上述規則,下面是一個端點的具體示例:
GET /v2/ubuntu/nginx/manifests/latest
3. Docker 註冊表 API V2
在撰寫本文時,V2 是 Registry API 的當前版本。讓我們探索如何使用它來列出來自遠程註冊表的圖像和標籤。
假設我們在 URL https://my-registry.io.
我們將使用curl
來執行 HTTP 請求。
3.1。列出圖像
要在註冊表中列出圖像,我們可以使用 _/ catalog
端點:
$ curl -X GET my-registry.io/v2/_catalog
{"repositories":["centos","ubuntu"]}
我們應該注意,如果啟用了某些存儲庫,則可能需要進行身份驗證才能訪問某些存儲庫。在這種情況下,我們可以使用-u
選項將用戶名和密碼作為參數傳遞給curl
命令。
$ curl -u user:password -X GET my-registry.io/v2/_catalog
{"repositories":["centos","ubuntu"]}
3.2.分頁列表圖像
有時,註冊表會有大量圖像。在這種情況下,我們可以將n=<number of results>
參數添加到 _/ catalog
端點以獲得分頁響應:
$ curl -X GET my-registry.io/v2/_catalog?n=1
{"repositories":["centos"]}
響應現在只包含第一張圖片。
我們可以使用對第一個請求的響應來獲取下一頁結果。這需要對 curl 命令進行兩處更改:
- _/
catalog
ast
的最後A l
參數,包含上一個請求中返回的最後一個圖像名稱。 - 將新請求鏈接到前一個請求的標頭。標頭具有以下格式:
Link: <my-registry.io/v2/_catalog?n=1&last=centos>; rel="next"
URL 周圍的括號是必需的。 URL 與新請求的 URL 相同。 rel=”next”
標頭表示新請求是根據RFC 5988的前一個請求的延續。
所以讓我們發出下一個請求:
$ curl -H 'Link: <my-registry.io/v2/_catalog?n=1&last=centos>; rel="next"' -X GET "my-registry.io/v2/_catalog?n=1&last=centos"
{"repositories":["ubuntu"]}
響應返回包含一個圖像的下一頁結果。
3.3.列出標籤
要列出圖像的標籤,我們可以使用/tags/list
端點:
$ curl -X GET my-registry.io/v2/ubuntu/tags/list
{"name":"ubuntu","tags":["latest","16.04"]}
響應包含圖像的名稱和與其關聯的標籤數組。
我們還可以使用與我們在圖像列表中看到的相同規則的分頁。
4. Docker 註冊表 API V1
Registry API v1 在 Docker 17.06 中被棄用並在 Docker 17.12 中被移除。但是,如果我們遇到在棄用之前託管的註冊表,我們可以使用 v1 API。讓我們探討一下在這種情況下我們的請求是如何變化的。
4.1。列出圖像
在 v1 中沒有列出圖像的直接端點。相反,我們可以使用docker search
命令來搜索包含給定字符串的圖像:
$ docker search my-registry.io/centos
這將返回名稱或描述中包含字符串“centos”的圖像列表。
如果我們不指定註冊表,則搜索將在默認註冊表中執行。默認存儲庫是 Docker Hub 存儲庫。
例如,下圖顯示了我們在不指定任何存儲庫的情況下搜索術語“ubuntu”時的輸出。
4.2.列出標籤
列出標籤的方法類似於 v2 API。但是,在這種情況下,輸出是不同的:
$ curl -X GET https://registry.hub.docker.com/v1/repositories/baeldung/mesos-marathon-demo/tags
[{"layer": "", "name": "32"}, {"layer": "", "name": "33"}, {"layer": "", "name": "34"}]
正如我們所見,我們有一個對像數組,而不是單個標籤數組。每個對像都包含標籤的名稱和圖像的圖層 ID。
如果需要,我們可以將響應轉換為數組。為此,讓我們將輸出通過管道傳輸到jq
命令並解析 JSON:
$ curl -s GET https://registry.hub.docker.com/v1/repositories/baeldung/mesos-marathon-demo/tags | jq -r '[.[].name]'
[
"32",
"33",
"34"
]
讓我們了解這裡使用的jq
命令和表達式:
-
-r
標誌將輸出作為原始文本返回。 - 表達式
.[].name
從curl
輸出中返回每個對象的name
屬性。 - 表達式周圍的方括號
[]
表示我們希望將輸出收集到一個數組中。
最後,需要與 curl 命令一起使用的-s
標誌來抑制進度條輸出。
5. 結論
在本文中,我們探討瞭如何使用 Docker Registry API 列出遠程註冊表中的圖像和標籤。
我們還研究瞭如何發送對圖像和標籤的分頁請求以及如何解析 JSON 響應。