为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后才会拉出来。我想我想要的是一种处理返回对象的方法,这对我来说是新的。这与我想要的非常接近-阻止这个过程,直到图像被提取,最后打印状态完成。经过测试,工作正常,谢谢!我根据测试和工作实现了事件处理和日志记录,谢谢!我是汉德林