在golang中尝试使用exec.Command()执行docker pull时,我没有看到进度条

在golang中尝试使用exec.Command()执行docker pull时,我没有看到进度条,docker,go,Docker,Go,我正在使用Go exec包执行一个docker pull debian命令: import ( "bufio" "os/exec" "strings" ) func main() { cmd := exec.Command("docker", "pull", "debian") stdout, _ := cmd.StdoutPipe()

我正在使用Go exec包执行一个
docker pull debian
命令:

import (
    "bufio"
    "os/exec"
    "strings"
)

func main() {
    cmd := exec.Command("docker", "pull", "debian")
    stdout, _ := cmd.StdoutPipe()
    cmd.Start()
    scanner := bufio.NewScanner(stdout)
    for scanner.Scan() {
        fmt.Println(scanner.Text())
    }
    return nil
}
但它从不向我显示进度条。它仅在更新完全完成时显示更新。对于超过GB的较大图像,很难看到是否有进展。这就是它所显示的:

e9afc4f90ab0: Pulling fs layer
e9afc4f90ab0: Verifying Checksum
e9afc4f90ab0: Download complete
e9afc4f90ab0: Pull complete
在终端中运行
docker pull debian
时,是否可以获得类似于我所看到的输出,或者可以用来显示进度的输出

e9afc4f90ab0: Downloading [==========>                                        ]  10.73MB/50.39MB

正如David提到的,您更愿意使用与docker交互

初始化docker客户端

cli, _ := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
拉动图像

reader, _ := cli.ImagePull(context.Background(), "hello-world", types.ImagePullOptions{})
解析json流

id, isTerm := term.GetFdInfo(os.Stdout)
_ = jsonmessage.DisplayJSONMessagesStream(reader, os.Stdout, id, isTerm, nil)

当您执行docker pull hello world时,您将获得与docker cli相同的输出。

进度条需要tty,并且
StdoutPipe
不是tty。@JimB感谢您的帮助。如果
StdoutPipe
不是正确的解决方案,是否有方法显示进度?您可能更喜欢尝试调用
docker
子命令。不过,这将取决于您的应用程序来显示进度。@毅力:如果在cli上使用此命令,您可以只分配实际的标准输出,而不是扫描和重写输出。如果没有,您可能应该通过docker API以编程方式执行此操作。