From 125302cfa672919c2c6a8722e8f5e870e8f272b4 Mon Sep 17 00:00:00 2001 From: Arash Deshmeh Date: Fri, 4 Aug 2017 16:25:29 -0400 Subject: [PATCH] docker rm -f exits with 1 if the image was not removed Signed-off-by: Arash Deshmeh --- cli/command/image/remove.go | 7 ++++- cli/command/image/remove_test.go | 29 +++++++++++++++++-- ...ess.Image Deleted with force option.golden | 0 ...s.Image not found with force option.golden | 1 + 4 files changed, 33 insertions(+), 4 deletions(-) delete mode 100644 cli/command/image/testdata/remove-command-success.Image Deleted with force option.golden create mode 100644 cli/command/image/testdata/remove-command-success.Image not found with force option.golden diff --git a/cli/command/image/remove.go b/cli/command/image/remove.go index 894d30574b..0687134904 100644 --- a/cli/command/image/remove.go +++ b/cli/command/image/remove.go @@ -9,6 +9,7 @@ import ( "github.com/docker/cli/cli" "github.com/docker/cli/cli/command" "github.com/docker/docker/api/types" + apiclient "github.com/docker/docker/client" "github.com/pkg/errors" "github.com/spf13/cobra" ) @@ -56,9 +57,13 @@ func runRemove(dockerCli command.Cli, opts removeOptions, images []string) error } var errs []string + var fatalErr = false for _, img := range images { dels, err := client.ImageRemove(ctx, img, options) if err != nil { + if !apiclient.IsErrNotFound(err) { + fatalErr = true + } errs = append(errs, err.Error()) } else { for _, del := range dels { @@ -73,7 +78,7 @@ func runRemove(dockerCli command.Cli, opts removeOptions, images []string) error if len(errs) > 0 { msg := strings.Join(errs, "\n") - if !opts.force { + if !opts.force || fatalErr { return errors.New(msg) } fmt.Fprintf(dockerCli.Err(), msg) diff --git a/cli/command/image/remove_test.go b/cli/command/image/remove_test.go index e89e6ddaf8..de4af8b461 100644 --- a/cli/command/image/remove_test.go +++ b/cli/command/image/remove_test.go @@ -13,6 +13,18 @@ import ( "github.com/stretchr/testify/assert" ) +type notFound struct { + imageID string +} + +func (n notFound) Error() string { + return fmt.Sprintf("Error: No such image: %s", n.imageID) +} + +func (n notFound) NotFound() bool { + return true +} + func TestNewRemoveCommandAlias(t *testing.T) { cmd := newRemoveCommand(test.NewFakeCli(&fakeClient{})) assert.True(t, cmd.HasAlias("rmi")) @@ -31,6 +43,15 @@ func TestNewRemoveCommandErrors(t *testing.T) { name: "wrong args", expectedError: "requires at least 1 argument.", }, + { + name: "ImageRemove fail with force option", + args: []string{"-f", "image1"}, + expectedError: "error removing image", + imageRemoveFunc: func(image string, options types.ImageRemoveOptions) ([]types.ImageDeleteResponseItem, error) { + assert.Equal(t, "image1", image) + return []types.ImageDeleteResponseItem{}, errors.Errorf("error removing image") + }, + }, { name: "ImageRemove fail", args: []string{"arg1"}, @@ -68,14 +89,16 @@ func TestNewRemoveCommandSuccess(t *testing.T) { }, }, { - name: "Image Deleted with force option", + name: "Image not found with force option", args: []string{"-f", "image1"}, imageRemoveFunc: func(image string, options types.ImageRemoveOptions) ([]types.ImageDeleteResponseItem, error) { assert.Equal(t, "image1", image) - return []types.ImageDeleteResponseItem{}, errors.Errorf("error removing image") + assert.Equal(t, true, options.Force) + return []types.ImageDeleteResponseItem{}, notFound{"image1"} }, - expectedErrMsg: "error removing image", + expectedErrMsg: "Error: No such image: image1", }, + { name: "Image Untagged", args: []string{"image1"}, diff --git a/cli/command/image/testdata/remove-command-success.Image Deleted with force option.golden b/cli/command/image/testdata/remove-command-success.Image Deleted with force option.golden deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/cli/command/image/testdata/remove-command-success.Image not found with force option.golden b/cli/command/image/testdata/remove-command-success.Image not found with force option.golden new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/cli/command/image/testdata/remove-command-success.Image not found with force option.golden @@ -0,0 +1 @@ +