我正在尝试使用Go SDK库将映像推送到Docker集线器。
拉图像,标记等工作,但我不能推图像。

该程序也不会引发任何错误。

package main

import (
    "context"
    "encoding/base64"
    "encoding/json"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
)

func check(err error) {
    if err != nil {
        panic(err)
    }
}

func main() {
    ctx := context.Background()

    cli, err := client.NewEnvClient()
    check(err)

    err = cli.ImageTag(ctx, "alpine:3", "docker.io/jerrymannel/alpine:3")
    check(err)

    authConfig := types.AuthConfig{
        Username: "<username>",
        Password: "<password>",
    }
    encodedJSON, err := json.Marshal(authConfig)
    check(err)
    authStr := base64.URLEncoding.EncodeToString(encodedJSON)

    _, err = cli.ImagePush(ctx, "docker.io/jerrymannel/alpine:3", types.ImagePushOptions{
        RegistryAuth: authStr,
    })
    check(err)

}

最佳答案

花了一天的时间后,我问了这个问题5分钟后找到了解决方案。

我输入了错误的用户名和密码。如果用户名或密码错误,cli.ImagePush()方法不会返回错误。

像这样修改最后几行,

pusher, err := cli.ImagePush(ctx, "docker.io/jerrymannel/alpine:3", types.ImagePushOptions{
    RegistryAuth: authStr,
})
check(err)

defer pusher.Close()
io.Copy(os.Stdout, pusher)

那显示了以下消息-
{"errorDetail":{"message":"unauthorized: incorrect username or password"},"error":"unauthorized: incorrect username or password"}

给出了正确的密码,现在可以使用了。

[更新]

这个Defect 36253有一个公开的缺陷

现在,这里是处理错误的代码。

pusher, err := cli.ImagePush(ctx, "docker.io/jerrymannel/alpine:3", types.ImagePushOptions{
    RegistryAuth: authStr,
})
check(err)
defer pusher.Close()

type ErrorMessage struct {
    Error string
}
var errorMessage ErrorMessage
buffIOReader := bufio.NewReader(pusher)

for {
    streamBytes, err := buffIOReader.ReadBytes('\n')
    if err == io.EOF {
        break
    }
    json.Unmarshal(streamBytes, &errorMessage)
    if errorMessage.Error != "" {
        panic(errorMessage.Error)
    }
}

07-24 09:49
查看更多