From 37d6fee8cfddd8e1afabbdaa232fa64a36494579 Mon Sep 17 00:00:00 2001 From: David Calavera Date: Fri, 4 Dec 2015 13:13:43 -0500 Subject: [PATCH] Implement docker rmi with standalone client lib. Signed-off-by: David Calavera --- api/client/lib/image_remove.go | 37 ++++++++++++++++++++++++++++++++++ api/client/rmi.go | 20 ++++++++---------- 2 files changed, 45 insertions(+), 12 deletions(-) create mode 100644 api/client/lib/image_remove.go diff --git a/api/client/lib/image_remove.go b/api/client/lib/image_remove.go new file mode 100644 index 0000000000..00d1bada83 --- /dev/null +++ b/api/client/lib/image_remove.go @@ -0,0 +1,37 @@ +package lib + +import ( + "encoding/json" + "net/url" + + "github.com/docker/docker/api/types" +) + +// ImageRemoveOptions holds parameters to remove images. +type ImageRemoveOptions struct { + ImageID string + Force bool + PruneChildren bool +} + +// ImageRemove removes an image from the docker host. +func (cli *Client) ImageRemove(options ImageRemoveOptions) ([]types.ImageDelete, error) { + var query url.Values + + if options.Force { + query.Set("force", "1") + } + if !options.PruneChildren { + query.Set("noprune", "1") + } + + resp, err := cli.DELETE("/images/"+options.ImageID, query, nil) + if err != nil { + return nil, err + } + defer ensureReaderClosed(resp) + + var dels []types.ImageDelete + err = json.NewDecoder(resp.body).Decode(&dels) + return dels, err +} diff --git a/api/client/rmi.go b/api/client/rmi.go index b4e3700684..a618031831 100644 --- a/api/client/rmi.go +++ b/api/client/rmi.go @@ -1,11 +1,10 @@ package client import ( - "encoding/json" "fmt" "net/url" - "github.com/docker/docker/api/types" + "github.com/docker/docker/api/client/lib" Cli "github.com/docker/docker/cli" flag "github.com/docker/docker/pkg/mflag" ) @@ -31,20 +30,17 @@ func (cli *DockerCli) CmdRmi(args ...string) error { var errNames []string for _, name := range cmd.Args() { - serverResp, err := cli.call("DELETE", "/images/"+name+"?"+v.Encode(), nil, nil) + options := lib.ImageRemoveOptions{ + ImageID: name, + Force: *force, + PruneChildren: !*noprune, + } + + dels, err := cli.client.ImageRemove(options) if err != nil { fmt.Fprintf(cli.err, "%s\n", err) errNames = append(errNames, name) } else { - defer serverResp.body.Close() - - dels := []types.ImageDelete{} - if err := json.NewDecoder(serverResp.body).Decode(&dels); err != nil { - fmt.Fprintf(cli.err, "%s\n", err) - errNames = append(errNames, name) - continue - } - for _, del := range dels { if del.Deleted != "" { fmt.Fprintf(cli.out, "Deleted: %s\n", del.Deleted)