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  }