为了账号安全,请及时绑定邮箱和手机立即绑定

在 Docker Golang SDK 中为 client.ImagePull() 禁用详细标准输出

在 Docker Golang SDK 中为 client.ImagePull() 禁用详细标准输出

Go
智慧大石 2022-07-11 15:09:18
使用 拉取图像时ImagePull(),终端中有大量标准输出显示拉取进度,即;{"status":"Downloading","progressDetail":{"current":6433248,"total":7964517},"progress":"[========================================\u003e          ]  6.433MB/7.965MB","id":"ae5cee1a3f12"}func PullImage(imageName string) bool {    ctx := context.Background()    cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())    if err != nil {        log.Error(err)        return false    }    //TODO: Need to disable Stdout!!    log.Info("\t\tPulling image " + imageName)    out, err := cli.ImagePull(ctx, imageName, types.ImagePullOptions{})    if err != nil {        log.Error(err)        return false    }    defer out.Close()    io.Copy(os.Stdout, out)    log.Info("Pulled image " + imageName + " into host")    return true}我搜索了文档,但没有找到禁用 StdOut 或更改详细程度的方法。我不太了解这io.Copy(os.Stdout, out)条线,但据我所知,禁用它会导致没有图像被拉出。我们如何隐藏输出ImagePull()?
查看完整描述

1 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

我不太了解 io.Copy(os.Stdout, out) 行,但据我所知,禁用它会导致没有图像被拉出。


io.Copyio.Reader简单地从一个(在本例io.ReadCloser中也是一个)中读取所有数据io.Reader并将其写入一个io.Writer.


我的理解是,如果您不执行此步骤,则main返回之前ImagePull有机会在后台完成。


但是,如果您确实执行io.Copy了 ,则复制会保持main足够长的时间以使拉取实际完成。


在上面评论中的示例中,我一直main忙于for/sleep循环。


你看到所有输出的原因是因为......好吧,你将输出复制ImagePull到Stdoutwith io.Copy(os.Stdout, out),所以我们ImagePull在 stdout 中看到输出也就不足为奇了。


相反,如果我们将所有输出复制到某个使输出消失的“黑洞”中,我们会main在复制发生时保持忙碌,同时抑制其所有输出。


一种方法是使用io/ioutil's ioutil.Discard。这是一个io.Writer简单地丢弃所有写入它的数据。


因此,只需将您io.Copy(os.Stdout, out)的行替换为以下内容:


import {

    "io/ioutil"

}


io.Copy(ioutil.Discard, out)


查看完整回答
反对 回复 2022-07-11
  • 1 回答
  • 0 关注
  • 166 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信