使用Go代码拉取containerd镜像时如何显示拉取进度

问题描述 投票:0回答:1

我正在使用以下 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)吗?任何想法将不胜感激。

go containers containerd
1个回答
0
投票

使用 github.com/schollz/progressbar/v3 显示 progress,如下所示:

enter image description here

我尝试过的代码:

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
}
© www.soinside.com 2019 - 2024. All rights reserved.