diff --git a/api/client/commands.go b/api/client/commands.go index 8882e2c1e6..b843106a72 100644 --- a/api/client/commands.go +++ b/api/client/commands.go @@ -13,7 +13,6 @@ func (cli *DockerCli) Command(name string) func(...string) error { "ps": cli.CmdPs, "pull": cli.CmdPull, "push": cli.CmdPush, - "save": cli.CmdSave, "update": cli.CmdUpdate, }[name] } diff --git a/api/client/image/save.go b/api/client/image/save.go new file mode 100644 index 0000000000..c5ea849a38 --- /dev/null +++ b/api/client/image/save.go @@ -0,0 +1,57 @@ +package image + +import ( + "errors" + "io" + + "golang.org/x/net/context" + + "github.com/docker/docker/api/client" + "github.com/docker/docker/cli" + "github.com/spf13/cobra" +) + +type saveOptions struct { + images []string + output string +} + +// NewSaveCommand creates a new `docker save` command +func NewSaveCommand(dockerCli *client.DockerCli) *cobra.Command { + var opts saveOptions + + cmd := &cobra.Command{ + Use: "save [OPTIONS] IMAGE [IMAGE...]", + Short: "Save one or more images to a tar archive (streamed to STDOUT by default)", + Args: cli.RequiresMinArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + opts.images = args + return runSave(dockerCli, opts) + }, + } + + flags := cmd.Flags() + + flags.StringVarP(&opts.output, "output", "o", "", "Write to a file, instead of STDOUT") + + return cmd +} + +func runSave(dockerCli *client.DockerCli, opts saveOptions) error { + if opts.output == "" && dockerCli.IsTerminalOut() { + return errors.New("Cowardly refusing to save to a terminal. Use the -o flag or redirect.") + } + + responseBody, err := dockerCli.Client().ImageSave(context.Background(), opts.images) + if err != nil { + return err + } + defer responseBody.Close() + + if opts.output == "" { + _, err := io.Copy(dockerCli.Out(), responseBody) + return err + } + + return client.CopyToFile(opts.output, responseBody) +} diff --git a/api/client/save.go b/api/client/save.go deleted file mode 100644 index dfbce203be..0000000000 --- a/api/client/save.go +++ /dev/null @@ -1,42 +0,0 @@ -package client - -import ( - "errors" - "io" - - "golang.org/x/net/context" - - Cli "github.com/docker/docker/cli" - flag "github.com/docker/docker/pkg/mflag" -) - -// CmdSave saves one or more images to a tar archive. -// -// The tar archive is written to STDOUT by default, or written to a file. -// -// Usage: docker save [OPTIONS] IMAGE [IMAGE...] -func (cli *DockerCli) CmdSave(args ...string) error { - cmd := Cli.Subcmd("save", []string{"IMAGE [IMAGE...]"}, Cli.DockerCommands["save"].Description+" (streamed to STDOUT by default)", true) - outfile := cmd.String([]string{"o", "-output"}, "", "Write to a file, instead of STDOUT") - cmd.Require(flag.Min, 1) - - cmd.ParseFlags(args, true) - - if *outfile == "" && cli.isTerminalOut { - return errors.New("Cowardly refusing to save to a terminal. Use the -o flag or redirect.") - } - - responseBody, err := cli.client.ImageSave(context.Background(), cmd.Args()) - if err != nil { - return err - } - defer responseBody.Close() - - if *outfile == "" { - _, err := io.Copy(cli.out, responseBody) - return err - } - - return CopyToFile(*outfile, responseBody) - -} diff --git a/cli/cobraadaptor/adaptor.go b/cli/cobraadaptor/adaptor.go index c5fcac0698..a9bdd1a170 100644 --- a/cli/cobraadaptor/adaptor.go +++ b/cli/cobraadaptor/adaptor.go @@ -58,6 +58,7 @@ func NewCobraAdaptor(clientFlags *cliflags.ClientFlags) CobraAdaptor { image.NewImagesCommand(dockerCli), image.NewLoadCommand(dockerCli), image.NewRemoveCommand(dockerCli), + image.NewSaveCommand(dockerCli), image.NewSearchCommand(dockerCli), image.NewImportCommand(dockerCli), image.NewTagCommand(dockerCli), diff --git a/cli/usage.go b/cli/usage.go index b6d0439052..20eae80f74 100644 --- a/cli/usage.go +++ b/cli/usage.go @@ -18,7 +18,6 @@ var DockerCommandUsage = []Command{ {"ps", "List containers"}, {"pull", "Pull an image or a repository from a registry"}, {"push", "Push an image or a repository to a registry"}, - {"save", "Save one or more images to a tar archive"}, {"update", "Update configuration of one or more containers"}, }