system prune: only warn about volumes if --volumes is given

Signed-off-by: Harald Albers <github@albersweb.de>
This commit is contained in:
Harald Albers 2017-06-29 14:52:32 +02:00
parent 92a2a1d539
commit 849b0e96a0
1 changed files with 30 additions and 20 deletions

View File

@ -1,7 +1,9 @@
package system package system
import ( import (
"bytes"
"fmt" "fmt"
"text/template"
"github.com/docker/cli/cli" "github.com/docker/cli/cli"
"github.com/docker/cli/cli/command" "github.com/docker/cli/cli/command"
@ -44,29 +46,14 @@ func NewPruneCommand(dockerCli command.Cli) *cobra.Command {
return cmd return cmd
} }
const ( const confirmationTemplate = `WARNING! This will remove:
warning = `WARNING! This will remove: {{- range $_, $warning := . }}
- all stopped containers - {{ $warning }}
- all volumes not used by at least one container {{- end }}
- all networks not used by at least one container
%s
- all build cache
Are you sure you want to continue?` Are you sure you want to continue?`
danglingImageDesc = "- all dangling images"
allImageDesc = `- all images without at least one container associated to them`
)
func runPrune(dockerCli command.Cli, options pruneOptions) error { func runPrune(dockerCli command.Cli, options pruneOptions) error {
var message string if !options.force && !command.PromptForConfirmation(dockerCli.In(), dockerCli.Out(), confirmationMessage(options)) {
if options.all {
message = fmt.Sprintf(warning, allImageDesc)
} else {
message = fmt.Sprintf(warning, danglingImageDesc)
}
if !options.force && !command.PromptForConfirmation(dockerCli.In(), dockerCli.Out(), message) {
return nil return nil
} }
@ -109,3 +96,26 @@ func runPrune(dockerCli command.Cli, options pruneOptions) error {
return nil return nil
} }
// confirmationMessage constructs a confirmation message that depends on the cli options.
func confirmationMessage(options pruneOptions) string {
t := template.Must(template.New("confirmation message").Parse(confirmationTemplate))
warnings := []string{
"all stopped containers",
"all networks not used by at least one container",
}
if options.pruneVolumes {
warnings = append(warnings, "all volumes not used by at least one container")
}
if options.all {
warnings = append(warnings, "all images without at least one container associated to them")
} else {
warnings = append(warnings, "all dangling images")
}
warnings = append(warnings, "all build cache")
var buffer bytes.Buffer
t.Execute(&buffer, &warnings)
return buffer.String()
}