猿问

使用 Go 访问远程 docker 存储库

我需要使用 Go 和协议 V2 访问私有 docker 注册表。我需要在私有注册表中列出存储库,获取它们的所有标签和其他信息。我应该为此使用 docker/distribution/registry/client 吗?是否有此类任务的样本?找不到。。。官网只提供http api文档。


我写了一些代码:


    registry, err := client.NewRegistry("https://registry-1.docker.io/", http.DefaultTransport)

    if err != nil {

        log.Error("Error creating the registry: {}", err)

        return

    }


    ctx := context.Background()


    entries := make([]string, 5)


    numFilled, err := registry.Repositories(ctx, entries, "")

    if err != io.EOF {

        log.Error("Error getting the registry: {}", err)

        return

    }


    log.Info("Number of repositories: {}", numFilled)


    _ = registry

当然,docker repo 需要认证。但是我应该如何提供呢?是否有此类任务的文档?


HUWWW
浏览 222回答 2
2回答

交互式爱情

改编自源码包中的测试代码:import (    "github.com/docker/distribution/registry/client"    "github.com/docker/distribution/registry/client/auth"    "github.com/docker/distribution/registry/client/auth/challenge"    "github.com/docker/distribution/registry/client/transport")    type regCredentialStore struct {    username      string    password      string    refreshTokens map[string]string}func (tcs *regCredentialStore) Basic(*url.URL) (string, string) {    return tcs.username, tcs.password}func (tcs *regCredentialStore) RefreshToken(u *url.URL, service string) string {    return tcs.refreshTokens[service]}func (tcs *regCredentialStore) SetRefreshToken(u *url.URL, service string, token string) {    if tcs.refreshTokens != nil {        tcs.refreshTokens[service] = token    }}func main() {    creds := &regCredentialStore{username: "user", password: "pwd"}    challengeManager := challenge.NewSimpleManager()    _, err = ping(challengeManager, "https://registry-1.docker.io/v2/", "")    if err != nil {        .... exit .....    }    transport1 := transport.NewTransport(        nil, auth.NewAuthorizer(challengeManager, auth.NewBasicHandler(creds)))    reg, err := client.NewRegistry("https://registry-1.docker.io/", transport1)    ...}   func ping(manager challenge.Manager, endpoint, versionHeader string) ([]auth.APIVersion, error) {    resp, err := http.Get(endpoint)    if err != nil {        return nil, err    }    defer resp.Body.Close()    if err := manager.AddResponse(resp); err != nil {        return nil, err    }    return auth.APIVersions(resp, versionHeader), err}

aluckdog

您可以使用 auth 标头触发简单的 http 调用(因为它只是 HTTP API),例如所选图像的列表标签:req, _ := http.NewRequest("GET", "https://"+privateDockerRegistry+"/v2/"+dockerImage+"/tags/list", nil)req.Header.Add("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(os.Getenv("DOCKER_USER")+":"+os.Getenv("DOCKER_PASSWORD"))))req.Header.Add("Accept", "application/json")resp, _ := client.Do(req)...
随时随地看视频慕课网APP

相关分类

Go
我要回答