github.com/afbjorklund/moby@v20.10.5+incompatible/daemon/disk_usage.go (about) 1 package daemon // import "github.com/docker/docker/daemon" 2 3 import ( 4 "context" 5 "fmt" 6 "sync/atomic" 7 8 "github.com/docker/docker/api/types" 9 "github.com/docker/docker/api/types/filters" 10 ) 11 12 // SystemDiskUsage returns information about the daemon data disk usage 13 func (daemon *Daemon) SystemDiskUsage(ctx context.Context) (*types.DiskUsage, error) { 14 if !atomic.CompareAndSwapInt32(&daemon.diskUsageRunning, 0, 1) { 15 return nil, fmt.Errorf("a disk usage operation is already running") 16 } 17 defer atomic.StoreInt32(&daemon.diskUsageRunning, 0) 18 19 // Retrieve container list 20 allContainers, err := daemon.Containers(&types.ContainerListOptions{ 21 Size: true, 22 All: true, 23 }) 24 if err != nil { 25 return nil, fmt.Errorf("failed to retrieve container list: %v", err) 26 } 27 28 // Get all top images with extra attributes 29 allImages, err := daemon.imageService.Images(filters.NewArgs(), false, true) 30 if err != nil { 31 return nil, fmt.Errorf("failed to retrieve image list: %v", err) 32 } 33 34 localVolumes, err := daemon.volumes.LocalVolumesSize(ctx) 35 if err != nil { 36 return nil, err 37 } 38 39 allLayersSize, err := daemon.imageService.LayerDiskUsage(ctx) 40 if err != nil { 41 return nil, err 42 } 43 44 return &types.DiskUsage{ 45 LayersSize: allLayersSize, 46 Containers: allContainers, 47 Volumes: localVolumes, 48 Images: allImages, 49 }, nil 50 }