From 5ddcbc3c0058d1982f73305db1ceb372bcf1b229 Mon Sep 17 00:00:00 2001 From: boucher Date: Mon, 19 Sep 2016 12:01:16 -0400 Subject: [PATCH] Allow providing a custom storage directory for docker checkpoints Signed-off-by: boucher --- command/checkpoint/create.go | 13 ++++++++----- command/checkpoint/list.go | 25 +++++++++++++++++++++---- command/checkpoint/remove.go | 26 ++++++++++++++++++++++---- command/container/start.go | 16 ++++++++++------ 4 files changed, 61 insertions(+), 19 deletions(-) diff --git a/command/checkpoint/create.go b/command/checkpoint/create.go index d369718119..646901ccd6 100644 --- a/command/checkpoint/create.go +++ b/command/checkpoint/create.go @@ -10,9 +10,10 @@ import ( ) type createOptions struct { - container string - checkpoint string - leaveRunning bool + container string + checkpoint string + checkpointDir string + leaveRunning bool } func newCreateCommand(dockerCli *command.DockerCli) *cobra.Command { @@ -31,6 +32,7 @@ func newCreateCommand(dockerCli *command.DockerCli) *cobra.Command { flags := cmd.Flags() flags.BoolVar(&opts.leaveRunning, "leave-running", false, "leave the container running after checkpoint") + flags.StringVarP(&opts.checkpointDir, "checkpoint-dir", "", "", "use a custom checkpoint storage directory") return cmd } @@ -39,8 +41,9 @@ func runCreate(dockerCli *command.DockerCli, opts createOptions) error { client := dockerCli.Client() checkpointOpts := types.CheckpointCreateOptions{ - CheckpointID: opts.checkpoint, - Exit: !opts.leaveRunning, + CheckpointID: opts.checkpoint, + CheckpointDir: opts.checkpointDir, + Exit: !opts.leaveRunning, } err := client.CheckpointCreate(context.Background(), opts.container, checkpointOpts) diff --git a/command/checkpoint/list.go b/command/checkpoint/list.go index 7ba035890b..fef91a4ccd 100644 --- a/command/checkpoint/list.go +++ b/command/checkpoint/list.go @@ -6,27 +6,44 @@ import ( "golang.org/x/net/context" + "github.com/docker/docker/api/types" "github.com/docker/docker/cli" "github.com/docker/docker/cli/command" "github.com/spf13/cobra" ) +type listOptions struct { + checkpointDir string +} + func newListCommand(dockerCli *command.DockerCli) *cobra.Command { - return &cobra.Command{ + var opts listOptions + + cmd := &cobra.Command{ Use: "ls CONTAINER", Aliases: []string{"list"}, Short: "List checkpoints for a container", Args: cli.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { - return runList(dockerCli, args[0]) + return runList(dockerCli, args[0], opts) }, } + + flags := cmd.Flags() + flags.StringVarP(&opts.checkpointDir, "checkpoint-dir", "", "", "use a custom checkpoint storage directory") + + return cmd + } -func runList(dockerCli *command.DockerCli, container string) error { +func runList(dockerCli *command.DockerCli, container string, opts listOptions) error { client := dockerCli.Client() - checkpoints, err := client.CheckpointList(context.Background(), container) + listOpts := types.CheckpointListOptions{ + CheckpointDir: opts.checkpointDir, + } + + checkpoints, err := client.CheckpointList(context.Background(), container, listOpts) if err != nil { return err } diff --git a/command/checkpoint/remove.go b/command/checkpoint/remove.go index 82ce62312b..c6ec56df84 100644 --- a/command/checkpoint/remove.go +++ b/command/checkpoint/remove.go @@ -3,24 +3,42 @@ package checkpoint import ( "golang.org/x/net/context" + "github.com/docker/docker/api/types" "github.com/docker/docker/cli" "github.com/docker/docker/cli/command" "github.com/spf13/cobra" ) +type removeOptions struct { + checkpointDir string +} + func newRemoveCommand(dockerCli *command.DockerCli) *cobra.Command { - return &cobra.Command{ + var opts removeOptions + + cmd := &cobra.Command{ Use: "rm CONTAINER CHECKPOINT", Aliases: []string{"remove"}, Short: "Remove a checkpoint", Args: cli.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) error { - return runRemove(dockerCli, args[0], args[1]) + return runRemove(dockerCli, args[0], args[1], opts) }, } + + flags := cmd.Flags() + flags.StringVarP(&opts.checkpointDir, "checkpoint-dir", "", "", "use a custom checkpoint storage directory") + + return cmd } -func runRemove(dockerCli *command.DockerCli, container string, checkpoint string) error { +func runRemove(dockerCli *command.DockerCli, container string, checkpoint string, opts removeOptions) error { client := dockerCli.Client() - return client.CheckpointDelete(context.Background(), container, checkpoint) + + removeOpts := types.CheckpointDeleteOptions{ + CheckpointID: checkpoint, + CheckpointDir: opts.checkpointDir, + } + + return client.CheckpointDelete(context.Background(), container, removeOpts) } diff --git a/command/container/start.go b/command/container/start.go index 8693b3a550..8e0654da37 100644 --- a/command/container/start.go +++ b/command/container/start.go @@ -17,10 +17,11 @@ import ( ) type startOptions struct { - attach bool - openStdin bool - detachKeys string - checkpoint string + attach bool + openStdin bool + detachKeys string + checkpoint string + checkpointDir string containers []string } @@ -46,6 +47,7 @@ func NewStartCommand(dockerCli *command.DockerCli) *cobra.Command { if dockerCli.HasExperimental() { flags.StringVar(&opts.checkpoint, "checkpoint", "", "Restore from this checkpoint") + flags.StringVar(&opts.checkpointDir, "checkpoint-dir", "", "Use a custom checkpoint storage directory") } return cmd @@ -112,7 +114,8 @@ func runStart(dockerCli *command.DockerCli, opts *startOptions) error { // no matter it's detached, removed on daemon side(--rm) or exit normally. statusChan := waitExitOrRemoved(dockerCli, ctx, c.ID, c.HostConfig.AutoRemove) startOptions := types.ContainerStartOptions{ - CheckpointID: opts.checkpoint, + CheckpointID: opts.checkpoint, + CheckpointDir: opts.checkpointDir, } // 4. Start the container. @@ -145,7 +148,8 @@ func runStart(dockerCli *command.DockerCli, opts *startOptions) error { } container := opts.containers[0] startOptions := types.ContainerStartOptions{ - CheckpointID: opts.checkpoint, + CheckpointID: opts.checkpoint, + CheckpointDir: opts.checkpointDir, } return dockerCli.Client().ContainerStart(ctx, container, startOptions)