我正在开发一个Go脚本,它使用Docker API来实现我的项目.登录到我的存储库之后,我拉出了我想要的Docker镜像,但问题是ImagePull函数返回了一个io.ReadCloser的实例,我只能通过以下方式传递给系统输出:
io.Copy(os.Stdout,pullResp)
我可以看到响应很酷,但我找不到一个合适的方法来解析它并根据它来实现逻辑,如果已经下载了新版本的图像,它会做一些事情,如果是图像是最新的.
如果你曾经遇到过这个问题,我会很高兴你分享你的经验.
最佳答案
@radoslav-stoyanov在使用我的例子之前做的
#docker rmi busybox
然后运行代码
package main
import (
"encoding/json"
"fmt"
"github.com/docker/distribution/context"
docker "github.com/docker/engine-api/client"
"github.com/docker/engine-api/types"
"io"
"strings"
)
func main() {
// DOCKER
cli,err := docker.NewClient("unix:///var/run/docker.sock","v1.28",nil,map[string]string{"User-Agent": "engine-api-cli-1.0"})
if err != nil {
panic(err)
}
imageName := "busybox:latest"
events,err := cli.ImagePull(context.Background(),imageName,types.ImagePullOptions{})
if err != nil {
panic(err)
}
d := json.NewDecoder(events)
type Event struct {
Status string `json:"status"`
Error string `json:"error"`
Progress string `json:"progress"`
ProgressDetail struct {
Current int `json:"current"`
Total int `json:"total"`
} `json:"progressDetail"`
}
var event *Event
for {
if err := d.Decode(&event); err != nil {
if err == io.EOF {
break
}
panic(err)
}
fmt.Printf("EVENT: %+v\n",event)
}
// Latest event for new image
// EVENT: {Status:Status: Downloaded newer image for busybox:latest Error: Progress:[==================================================>] 699.2kB/699.2kB ProgressDetail:{Current:699243 Total:699243}}
// Latest event for up-to-date image
// EVENT: {Status:Status: Image is up to date for busybox:latest Error: Progress: ProgressDetail:{Current:0 Total:0}}
if event != nil {
if strings.Contains(event.Status,fmt.Sprintf("Downloaded newer image for %s",imageName)) {
// new
fmt.Println("new")
}
if strings.Contains(event.Status,fmt.Sprintf("Image is up to date for %s",imageName)) {
// up-to-date
fmt.Println("up-to-date")
}
}
}
你可以看到API格式来创建你的结构(比如我的事件),在这里阅读它们https://docs.docker.com/engine/api/v1.27/#operation/ImageCreate
我希望它可以帮助您解决问题,谢谢.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。