目前,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 信息。

获取 Docker Hub 镜像信息:搜索、分页、模糊查询及获取最新镜像版本 digest

原文地址: https://www.cveoy.top/t/topic/jl1I 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录