获取 Docker Hub 镜像信息:搜索、分页、模糊查询及获取最新镜像版本 digest
目前,Docker 官方已经不再提供公共的 API 来获取 Docker Hub 的镜像信息。因此,Golang Docker SDK 也无法直接获取远程 Hub 仓库的镜像信息。
但是,可以通过 Docker Hub 网站上提供的搜索 API 来实现获取 Hub 仓库的全部镜像信息,并支持分页和模糊查询。具体可以参考以下示例代码:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
)
const searchAPI = "https://hub.docker.com/api/content/v1/products/search"
type SearchResult struct {
TotalCount int `json:"total_count"`
Results []struct {
Name string `json:"name"`
Description string `json:"short_description"`
StarCount int `json:"star_count"`
} `json:"summaries"`
}
func searchImages(query string, page, pageSize int) (*SearchResult, error) {
params := url.Values{
"q": []string{query},
"page": []string{fmt.Sprintf("%d", page)},
"page_size": []string{fmt.Sprintf("%d", pageSize)},
}
resp, err := http.Get(fmt.Sprintf("%s?%s", searchAPI, params.Encode()))
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
var result SearchResult
if err := json.Unmarshal(body, &result); err != nil {
return nil, err
}
return &result, nil
}
func main() {
result, err := searchImages("golang", 1, 10)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Total count: %d\n", result.TotalCount)
for _, img := range result.Results {
fmt.Printf("Name: %s\nDescription: %s\nStar count: %d\n\n", img.Name, img.Description, img.StarCount)
}
}
通过以上代码,可以获取 Docker Hub 上所有名字中包含'golang'的镜像信息,并支持分页和每页大小的设置。
至于查询 latest 镜像版本的 digest,可以使用以下 API:
https://registry.hub.docker.com/v2/repositories/{repository_name}/tags/{tag_name}
其中,{repository_name} 为镜像的仓库名称,{tag_name} 为镜像的标签名称。例如,要查询golang:latest 镜像的 digest,可以使用以下代码:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
const registryAPI = "https://registry.hub.docker.com/v2/repositories"
type TagInfo struct {
Digest string `json:"digest"`
}
func getTagInfo(repoName, tagName string) (*TagInfo, error) {
resp, err := http.Get(fmt.Sprintf("%s/%s/tags/%s", registryAPI, repoName, tagName))
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
var result TagInfo
if err := json.Unmarshal(body, &result); err != nil {
return nil, err
}
return &result, nil
}
func main() {
info, err := getTagInfo("library/golang", "latest")
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(info.Digest)
}
通过以上代码,可以获取golang:latest 镜像的 digest 信息。
原文地址: https://www.cveoy.top/t/topic/jl1I 著作权归作者所有。请勿转载和采集!