使用 拉取图像时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)
- 1 回答
- 0 关注
- 166 浏览
添加回答
举报
0/150
提交
取消