6 "github.com/docker/cli/cli"
7 "github.com/docker/cli/cli/command"
8 "github.com/docker/cli/cli/command/prune"
9 "github.com/docker/cli/opts"
10 units "github.com/docker/go-units"
11 "github.com/spf13/cobra"
14 type pruneOptions struct {
21 // NewPruneCommand creates a new cobra.Command for `docker prune`
22 func NewPruneCommand(dockerCli command.Cli) *cobra.Command {
23 options := pruneOptions{filter: opts.NewFilterOpt()}
25 cmd := &cobra.Command{
26 Use: "prune [OPTIONS]",
27 Short: "Remove unused data",
29 RunE: func(cmd *cobra.Command, args []string) error {
30 return runPrune(dockerCli, options)
32 Tags: map[string]string{"version": "1.25"},
36 flags.BoolVarP(&options.force, "force", "f", false, "Do not prompt for confirmation")
37 flags.BoolVarP(&options.all, "all", "a", false, "Remove all unused images not just dangling ones")
38 flags.BoolVar(&options.pruneVolumes, "volumes", false, "Prune volumes")
39 flags.Var(&options.filter, "filter", "Provide filter values (e.g. 'label=<key>=<value>')")
40 // "filter" flag is available in 1.28 (docker 17.04) and up
41 flags.SetAnnotation("filter", "version", []string{"1.28"})
47 warning = `WARNING! This will remove:
48 - all stopped containers
49 - all volumes not used by at least one container
50 - all networks not used by at least one container
52 Are you sure you want to continue?`
54 danglingImageDesc = "- all dangling images"
55 allImageDesc = `- all images without at least one container associated to them`
58 func runPrune(dockerCli command.Cli, options pruneOptions) error {
62 message = fmt.Sprintf(warning, allImageDesc)
64 message = fmt.Sprintf(warning, danglingImageDesc)
67 if !options.force && !command.PromptForConfirmation(dockerCli.In(), dockerCli.Out(), message) {
71 var spaceReclaimed uint64
72 pruneFuncs := []func(dockerCli command.Cli, filter opts.FilterOpt) (uint64, string, error){
73 prune.RunContainerPrune,
74 prune.RunNetworkPrune,
76 if options.pruneVolumes {
77 pruneFuncs = append(pruneFuncs, prune.RunVolumePrune)
80 for _, pruneFn := range pruneFuncs {
81 spc, output, err := pruneFn(dockerCli, options.filter)
87 fmt.Fprintln(dockerCli.Out(), output)
91 spc, output, err := prune.RunImagePrune(dockerCli, options.all, options.filter)
97 fmt.Fprintln(dockerCli.Out(), output)
100 fmt.Fprintln(dockerCli.Out(), "Total reclaimed space:", units.HumanSize(float64(spaceReclaimed)))