`docker system df` 与 `/system/df` (docker api 端点)

`docker system df` 与 `/system/df` (docker api 端点)

php小编鱼仔在这里为大家介绍一下docker中的两个命令:`docker system df`和`/system/df`(docker api端点)。这两个命令都是用来查看docker系统资源使用情况的,但是它们的使用方式和结果展示方式略有不同。`docker system df`是一个docker命令,可以直接在终端中运行,它会显示出docker系统中各个资源(包括镜像、容器、数据卷等)的使用情况,以及总体的资源占用情况。而`/system/df`是一个docker api的端点,需要通过调用api来获取相关信息。它的返回结果与`docker system df`相似,但是更适合用于程序化的方式获取docker系统资源使用情况。

问题内容

我正在用 Go 编写一个程序,以从我的 docker 主机获取以 GB 为单位的总磁盘使用情况。为此,我使用 go lib 中的 func DiskUsage()

  • https://pkg.go.dev/github.com/docker/docker/client#Client.DiskUsage。

查看代码,该函数正在调用 docker api 端点 /system/df

  • https://docs.docker.com/engine/api/v1.43/#tag/System/operation/SystemDataUsage

但是,当我使用此库与使用命令 docker system df 计算 GB 时,我注意到一个奇怪的行为:

  • docker系统df输出:

    $ docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 223 4 21.02GB 20.7GB (98%) Containers 6 0 0B 0B Local Volumes 13 1 536.4MB 340.4MB (63%) Build Cache 954 0 13.51GB 13.51GB 登录后复制

  • My Go 应用程序输出:

    $ go run ./cmd/main.go Images: TOTAL (223), 17GB Build Cache: TOTAL (954), 29GB 登录后复制

正如您所看到的,两个输出之间存在差异。 我需要帮助来了解我从 /system/df 端点获取数据的计算是否有问题。谢谢:)

Go应用程序:

package main import ( "context" "fmt" "github.com/docker/docker/api/types" "github.com/docker/docker/client" ) func main() { cli, err := client.NewClientWithOpts(client.FromEnv) if err != nil { panic(err) } diskUsg, err := cli.DiskUsage(context.Background(), types.DiskUsageOptions{}) if err != nil { panic(err) } b := float64(0) for _, ch := range diskUsg.BuildCache { b = b + float64(ch.Size) } b2 := float64(0) for _, ch := range diskUsg.Images { if ch.Size > ch.SharedSize { b2 = b2 + (float64(ch.Size) - float64(ch.SharedSize)) continue } b2 = b2 + (float64(ch.SharedSize) - float64(ch.Size)) } fmt.Printf("Images: TOTAL (%d), %2.fGBn", len(diskUsg.Images), float64(b2)/(1登录后复制