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

使用 拉取图像时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()?


智慧大石
浏览 167回答 1
1回答

吃鸡游戏

我不太了解 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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go