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

标签 docker go sdk

当使用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的输出复制到Stdoutio.Copy(os.Stdout, out),因此我们在stdout中看到ImagePull的输出也就不足为奇了。
相反,如果我们将所有输出复制到某个使输出消失的“黑洞”中,那么在复制发生时,我们将使main处于繁忙状态,同时抑制其所有输出。
一种方法是使用io/ioutilioutil.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/

相关文章:

端口映射上的 Docker 群扩展行为

java - spring boot maven插件-jvm参数-直接内存大小设置

arrays - 如何找到数组中最长的字符串?

Golang 错误 - 复合文字中缺少类型

android - Android Studio错误-修订版24.0.0-alpha1无效

docker - 无法更新 Kubernetes 中 StatefulSet 的镜像

apache - docker 堆栈 : Apache service will not start

用于谷歌云存储的 Golang SDK : Multipart download

iOS SDK 检测应用程序是否已更新或新安装

cocoa - Xcode : cannot change main nib file