diff --git a/cli/command/node/remove.go b/cli/command/node/remove.go index 696cd58716..9ba21b44a2 100644 --- a/cli/command/node/remove.go +++ b/cli/command/node/remove.go @@ -2,6 +2,7 @@ package node import ( "fmt" + "strings" "golang.org/x/net/context" @@ -35,12 +36,21 @@ func newRemoveCommand(dockerCli *command.DockerCli) *cobra.Command { func runRemove(dockerCli *command.DockerCli, args []string, opts removeOptions) error { client := dockerCli.Client() ctx := context.Background() + + var errs []string + for _, nodeID := range args { err := client.NodeRemove(ctx, nodeID, types.NodeRemoveOptions{Force: opts.force}) if err != nil { - return err + errs = append(errs, err.Error()) + continue } fmt.Fprintf(dockerCli.Out(), "%s\n", nodeID) } + + if len(errs) > 0 { + return fmt.Errorf("%s", strings.Join(errs, "\n")) + } + return nil } diff --git a/cli/command/plugin/remove.go b/cli/command/plugin/remove.go index 800fc1b97f..4222690a4f 100644 --- a/cli/command/plugin/remove.go +++ b/cli/command/plugin/remove.go @@ -45,14 +45,16 @@ func runRemove(dockerCli *command.DockerCli, opts *rmOptions) error { for _, name := range opts.plugins { named, err := reference.ParseNamed(name) // FIXME: validate if err != nil { - return err + errs = append(errs, err) + continue } if reference.IsNameOnly(named) { named = reference.WithDefaultTag(named) } ref, ok := named.(reference.NamedTagged) if !ok { - return fmt.Errorf("invalid name: %s", named.String()) + errs = append(errs, fmt.Errorf("invalid name: %s", named.String())) + continue } // TODO: pass names to api instead of making multiple api calls if err := dockerCli.Client().PluginRemove(ctx, ref.String(), types.PluginRemoveOptions{Force: opts.force}); err != nil {