Rumah >pembangunan bahagian belakang >Golang >`docker system df` dan `/system/df` (docker api endpoint)

`docker system df` dan `/system/df` (docker api endpoint)

WBOY
WBOYke hadapan
2024-02-09 16:45:08567semak imbas

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

editor php Yuzai di sini untuk memperkenalkan kepada anda dua arahan dalam docker: `docker system df` dan `/system/df` (docker api endpoint). Kedua-dua arahan digunakan untuk melihat penggunaan sumber sistem docker, tetapi kaedah penggunaan dan paparan hasilnya sedikit berbeza. `sistem docker df` ialah arahan docker yang boleh dijalankan terus dalam terminal Ia akan memaparkan penggunaan pelbagai sumber (termasuk imej, bekas, volum data, dll.) dalam sistem docker, serta penggunaan sumber keseluruhan. . Dan `/system/df` ialah titik akhir API docker, dan anda perlu mendapatkan maklumat yang berkaitan dengan memanggil API. Hasil pulangannya adalah serupa dengan `sistem docker df`, tetapi ia lebih sesuai untuk mendapatkan penggunaan sumber sistem docker secara pemrograman.

Kandungan soalan

Saya sedang menulis program dalam Go untuk mendapatkan jumlah penggunaan cakera dalam GB daripada hos docker saya. Untuk ini saya menggunakan func DiskUsage() dari go lib:

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

Melihat kod, fungsi memanggil titik akhir api docker /system/df:

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

Walau bagaimanapun, apabila saya menggunakan perpustakaan ini dengan mengira GB menggunakan arahan docker system df, saya melihat tingkah laku pelik:

  • docker系统dfOutput:
    $ 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
    
  • Output aplikasi My Go:
    $ go run ./cmd/main.go
    Images: TOTAL (223), 17GB
    Build Cache: TOTAL (954), 29GB
    

Seperti yang anda lihat, terdapat perbezaan antara kedua-dua output. Saya memerlukan bantuan untuk memahami jika terdapat kesilapan dengan pengiraan saya yang mendapat data daripada /system/df titik akhir. Terima kasih :)

Apl 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.fGB\n", len(diskUsg.Images), float64(b2)/(1<<30))
    fmt.Printf("Build Cache: TOTAL (%d), %2.fGB\n", len(diskUsg.BuildCache), float64(b)/(1<<30))
}

Penyelesaian

Berdasarkan kod sumber Docker:

Anda sepatutnya dapat menghasilkan semula dengan tepat apa yang docker 系统 df lakukan menggunakan kod berikut:

  • go.mod
module 76982562-docker-system-df-vs-system-df-docker-api-endpoint

go 1.21.0

require (
    github.com/docker/cli v24.0.5+incompatible
    github.com/docker/docker v24.0.5+incompatible
)
  • main.go
<code>package main

import (
    "context"
    "fmt"
    "os"

    "github.com/docker/cli/cli/command/formatter"
    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
    "github.com/docker/go-units"
)

func main() {
    cli, err := client.NewClientWithOpts(client.FromEnv)
    if err != nil {
        panic(err)
    }

    diskUsage, err := cli.DiskUsage(context.Background(), types.DiskUsageOptions{})
    if err != nil {
        panic(err)
    }

    var bsz int64
    for _, bc := range diskUsage.BuildCache {
        if !bc.Shared {
            bsz += bc.Size
        }
    }

    fmt.Printf("Images: TOTAL (%d), %s\n", len(diskUsage.Images), units.HumanSize(float64(diskUsage.LayersSize)))
    fmt.Printf("Build Cache: TOTAL (%d), %s\n", len(diskUsage.BuildCache), units.HumanSize(float64(bsz)))
}
</code>
  • Untuk imej, docker库直接提供了diskUsage.LayersSize mewakili jumlah saiz, jadi anda tidak perlu mengiranya sendiri
  • Untuk cache binaan anda perlu mengecualikan projek kongsi (if !bc.Shared)

Untuk menukar saiz dalam unit yang betul, saya sangat mengesyorkan menggunakan github.com/docker/go-units (例如 units.HumanSize(float64(diskUsage.LayersSize))). Ini akan menyelamatkan anda mimpi ngeri penukaran unit!

Atas ialah kandungan terperinci `docker system df` dan `/system/df` (docker api endpoint). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam