在golang中尝试使用exec.Command()执行docker pull时,我没有看到进度条
我正在使用Go exec包执行一个在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()
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以编程方式执行此操作。