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

为client.ImagePull()禁用Docker Golang SDK中的详细标准输出,docker,go,sdk,Docker,Go,Sdk,当使用ImagePull()拉取图像时,终端中有大量的stdout显示拉取的进度,即: {"status":"Downloading","progressDetail":{"current":6433248,"total":7964517},"progress":"[========================================\u003e

当使用
ImagePull()
拉取图像时,终端中有大量的stdout显示拉取的进度,即:

{"status":"Downloading","progressDetail":{"current":6433248,"total":7964517},"progress":"[========================================\u003e          ]  6.433MB/7.965MB","id":"ae5cee1a3f12"}
func PullImage(imageName字符串)bool{
ctx:=context.Background()
cli,err:=client.NewClientWithOpts(client.FromEnv,client.withapiversiongotiation())
如果错误!=零{
日志错误(err)
返回错误
}
//TODO:需要禁用标准输出!!
log.Info(“\t\t推拉图像”+图像名称)
out,err:=cli.ImagePull(ctx,imageName,types.ImagePullOptions{})
如果错误!=零{
日志错误(err)
返回错误
}
推迟结束
io.Copy(os.Stdout,out)
log.Info(“将映像“+imageName+”拉入主机”)
返回真值
}
我已经搜索了,还没有找到一种方法来禁用标准输出或更改详细信息

我不太理解io.Copy(os.Stdout,out)行,但禁用它不会导致任何图像被提取,据我所知

我们如何从
ImagePull()
隐藏输出

我不太理解io.Copy(os.Stdout,out)行,但据我所知,禁用它不会导致任何图像被提取

io.Copy
只需从
io.Reader
读取所有数据(在本例中是
io.ReadCloser
,它也是
io.Reader
)并将其写入
io.Writer

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

但是,如果确实执行了
io.Copy
,则复制会使
main
保持足够长的忙碌时间,以使拉操作真正完成

在上面注释中的示例中,我让
main
忙着执行
for
/
sleep
循环

您看到所有输出的原因是。。。好的,您使用
io.copy(os.Stdout,out)
ImagePull
的输出复制到
Stdout
,因此我们在Stdout中看到
ImagePull
的输出就不足为奇了

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

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

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

import {
    "io/ioutil"
}

io.Copy(ioutil.Discard, out)
我不太理解io.Copy(os.Stdout,out)行,但据我所知,禁用它不会导致任何图像被提取

io.Copy
只需从
io.Reader
读取所有数据(在本例中是
io.ReadCloser
,它也是
io.Reader
)并将其写入
io.Writer

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

但是,如果确实执行了
io.Copy
,则复制会使
main
保持足够长的忙碌时间,以使拉操作真正完成

在上面注释中的示例中,我让
main
忙着执行
for
/
sleep
循环

您看到所有输出的原因是。。。好的,您使用
io.copy(os.Stdout,out)
ImagePull
的输出复制到
Stdout
,因此我们在Stdout中看到
ImagePull
的输出就不足为奇了

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

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

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

import {
    "io/ioutil"
}

io.Copy(ioutil.Discard, out)

我在运行时没有看到任何输出,我尝试了
,err=cli.ImagePull(ctx,os.Args[1],types.ImagePullOptions{})
,但是图像没有被拉入我的机器。你是什么意思?您是否记得将图像名称作为命令行参数传递给我的脚本?我不是告诉你如何解决你的问题,我只是向你展示一个示例脚本,它实际上与你的脚本完全相同,没有出现问题,以此向你展示你描述的问题不会重现。谢谢,这个脚本很有帮助,但仍然很混乱。我看到图像确实是通过
docker image ls
拉出来的,但只有在脚本上使用无限循环CTRL-C后才会拉出来。我想我想要的是一种处理返回对象的方法,这对我来说是新的。这与我想要的非常接近-阻止进程,直到图像被提取,最后打印状态完成。我在运行时没有看到任何输出,我尝试了
,err=cli.ImagePull(ctx,os.Args[1],types.ImagePullOptions{}
,但是图像没有被拉进我的机器。你是什么意思?您是否记得将图像名称作为命令行参数传递给我的脚本?我不是告诉你如何解决你的问题,我只是向你展示一个示例脚本,它实际上与你的脚本完全相同,没有出现问题,以此向你展示你描述的问题不会重现。谢谢,这个脚本很有帮助,但仍然很混乱。我看到图像确实是通过
docker image ls
拉出来的,但只有在脚本上使用无限循环CTRL-C后才会拉出来。我想我想要的是一种处理返回对象的方法,这对我来说是新的。这与我想要的非常接近-阻止这个过程,直到图像被提取,最后打印状态完成。经过测试,工作正常,谢谢!我根据测试和工作实现了事件处理和日志记录,谢谢!我是汉德林