我正在使用以下 Golang 代码来拉取 containerd 映像。
package main
import (
"context"
"log"
"github.com/containerd/containerd"
"github.com/containerd/containerd/namespaces"
)
func main() {
// create connection to containerd
client, err := containerd.New("/run/containerd/containerd.sock")
if err != nil {
log.Fatal(err)
}
defer client.Close()
// use k8s.io namespace
ctx := namespaces.WithNamespace(context.Background(), "k8s.io")
// pull image
image, err := client.Pull(ctx, "docker.io/library/openjdk:17", containerd.WithPullUnpack)
if err != nil {
log.Fatal(err)
}
log.Printf(" Pulled image: %s", image.Name())
}
代码运行良好,默默地为我拉取了图像。
问题是,我可以在拉取期间显示进度(例如在控制台上打印 BytesPulled/BytesTotal)吗?任何想法将不胜感激。
使用 github.com/schollz/progressbar/v3 显示 progress,如下所示:
我尝试过的代码:
package main
import (
"context"
"fmt"
"io"
"os"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
"github.com/schollz/progressbar/v3"
)
func main() {
cli, err := client.NewClientWithOpts(client.FromEnv)
if err != nil {
panic(err)
}
if err := pullImage(cli, "openjdk:8"); err != nil {
panic(err)
}
fmt.Println("Java 8 image has been successfully pulled.")
}
func pullImage(cli *client.Client, imageName string) error {
out, err := cli.ImagePull(context.Background(), imageName, types.ImagePullOptions{})
if err != nil {
return err
}
defer out.Close()
bar := progressbar.DefaultBytes(-1, "Pulling image")
_, err = io.Copy(io.MultiWriter(os.Stdout, bar), out)
return err
}