2 回答

TA贡献1712条经验 获得超3个赞
改编自源码包中的测试代码:
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 := ®CredentialStore{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
}

TA贡献1847条经验 获得超7个赞
您可以使用 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)
...
- 2 回答
- 0 关注
- 221 浏览
添加回答
举报