当使用ImagePull()
提取图像时,终端中会显示大量stdout来显示Pull的进度,即
{"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
}
我搜索了documentation,但没有找到禁用StdOut或更改详细程度的方法。我不太了解
io.Copy(os.Stdout, out)
行,但是据我所知,禁用它不会导致图像被拖拉。我们如何隐藏
ImagePull()
的输出?
最佳答案
I don't really understand the io.Copy(os.Stdout, out) line, but disabling it causes no image to be pulled, as far as I can tell.
io.Copy
只是从io.Reader
(在这种情况下也是io.ReadCloser
,也是io.Reader
)读取所有数据,并将其写入io.Writer
。我的理解是,如果您不执行此步骤,则
main
将在ImagePull
有机会在后台完成之前返回。但是,如果您确实执行
io.Copy
,则复制会使main
保持繁忙状态足够长的时间,以使提取操作实际完成。在上面注释中的示例中,我让
main
忙于for
/sleep
循环。看到所有输出的原因是……好吧,您将
ImagePull
的输出复制到Stdout
到io.Copy(os.Stdout, out)
,因此我们在stdout中看到ImagePull
的输出也就不足为奇了。相反,如果我们将所有输出复制到某个使输出消失的“黑洞”中,那么在复制发生时,我们将使
main
处于繁忙状态,同时抑制其所有输出。一种方法是使用
io/ioutil
的ioutil.Discard
。这是一个io.Writer
,仅丢弃所有写入其中的数据。因此,只需将
io.Copy(os.Stdout, out)
行替换为以下内容:import {
"io/ioutil"
}
io.Copy(ioutil.Discard, out)
关于docker - 在Docker Golang SDK中为client.ImagePull()禁用详细标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64510928/