github.1git.de/docker/cli@v26.1.3+incompatible/cli/command/system/df.go (about)

     1  package system
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/docker/cli/cli"
     7  	"github.com/docker/cli/cli/command"
     8  	"github.com/docker/cli/cli/command/completion"
     9  	"github.com/docker/cli/cli/command/formatter"
    10  	flagsHelper "github.com/docker/cli/cli/flags"
    11  	"github.com/docker/docker/api/types"
    12  	"github.com/spf13/cobra"
    13  )
    14  
    15  type diskUsageOptions struct {
    16  	verbose bool
    17  	format  string
    18  }
    19  
    20  // newDiskUsageCommand creates a new cobra.Command for `docker df`
    21  func newDiskUsageCommand(dockerCli command.Cli) *cobra.Command {
    22  	var opts diskUsageOptions
    23  
    24  	cmd := &cobra.Command{
    25  		Use:   "df [OPTIONS]",
    26  		Short: "Show docker disk usage",
    27  		Args:  cli.NoArgs,
    28  		RunE: func(cmd *cobra.Command, args []string) error {
    29  			return runDiskUsage(cmd.Context(), dockerCli, opts)
    30  		},
    31  		Annotations:       map[string]string{"version": "1.25"},
    32  		ValidArgsFunction: completion.NoComplete,
    33  	}
    34  
    35  	flags := cmd.Flags()
    36  
    37  	flags.BoolVarP(&opts.verbose, "verbose", "v", false, "Show detailed information on space usage")
    38  	flags.StringVar(&opts.format, "format", "", flagsHelper.FormatHelp)
    39  
    40  	return cmd
    41  }
    42  
    43  func runDiskUsage(ctx context.Context, dockerCli command.Cli, opts diskUsageOptions) error {
    44  	// TODO expose types.DiskUsageOptions.Types as flag on the command-line and/or as separate commands (docker container df / docker container usage)
    45  	du, err := dockerCli.Client().DiskUsage(ctx, types.DiskUsageOptions{})
    46  	if err != nil {
    47  		return err
    48  	}
    49  
    50  	format := opts.format
    51  	if len(format) == 0 {
    52  		format = formatter.TableFormatKey
    53  	}
    54  
    55  	var bsz int64
    56  	for _, bc := range du.BuildCache {
    57  		if !bc.Shared {
    58  			bsz += bc.Size
    59  		}
    60  	}
    61  
    62  	duCtx := formatter.DiskUsageContext{
    63  		Context: formatter.Context{
    64  			Output: dockerCli.Out(),
    65  			Format: formatter.NewDiskUsageFormat(format, opts.verbose),
    66  		},
    67  		LayersSize:  du.LayersSize,
    68  		BuilderSize: bsz,
    69  		BuildCache:  du.BuildCache,
    70  		Images:      du.Images,
    71  		Containers:  du.Containers,
    72  		Volumes:     du.Volumes,
    73  		Verbose:     opts.verbose,
    74  	}
    75  
    76  	return duCtx.Write()
    77  }