加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Golang – Docker API – 解析ImagePull的结果

发布时间:2020-12-16 03:49:14 所属栏目:安全 来源:网络整理
导读:我正在开发一个Go脚本,它使用Docker API来实现我的项目.登录到我的存储库之后,我拉出了我想要的Docker镜像,但问题是ImagePull函数返回了一个io.ReadCloser的实例,我只能通过以下方式传递给系统输出: io.Copy(os.Stdout,pullResp) 我可以看到响应很酷,但我找

我正在开发一个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: %+vn",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

我希望它可以帮助您解决问题,谢谢.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读