我正在尝试使用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)
}
}