github.com/DaoCloud/dao@v0.0.0-20161212064103-c3dbfd13ee36/api/client/container/commit.go (about)

     1  package container
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  
     7  	"golang.org/x/net/context"
     8  
     9  	"github.com/docker/docker/api/client"
    10  	"github.com/docker/docker/cli"
    11  	dockeropts "github.com/docker/docker/opts"
    12  	"github.com/docker/engine-api/types"
    13  	containertypes "github.com/docker/engine-api/types/container"
    14  	"github.com/spf13/cobra"
    15  )
    16  
    17  type commitOptions struct {
    18  	container string
    19  	reference string
    20  
    21  	pause   bool
    22  	comment string
    23  	author  string
    24  	changes dockeropts.ListOpts
    25  	config  string
    26  }
    27  
    28  // NewCommitCommand creats a new cobra.Command for `docker commit`
    29  func NewCommitCommand(dockerCli *client.DockerCli) *cobra.Command {
    30  	var opts commitOptions
    31  
    32  	cmd := &cobra.Command{
    33  		Use:   "commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]",
    34  		Short: "从一个容器的变化部分创建一个新的镜像",
    35  		Args:  cli.RequiresRangeArgs(1, 2),
    36  		RunE: func(cmd *cobra.Command, args []string) error {
    37  			opts.container = args[0]
    38  			if len(args) > 1 {
    39  				opts.reference = args[1]
    40  			}
    41  			return runCommit(dockerCli, &opts)
    42  		},
    43  	}
    44  
    45  	flags := cmd.Flags()
    46  	flags.SetInterspersed(false)
    47  
    48  	flags.BoolVarP(&opts.pause, "pause", "p", true, "在容器提交镜像过程中先暂停容器运行")
    49  	flags.StringVarP(&opts.comment, "message", "m", "", "容器提交镜像的消息")
    50  	flags.StringVarP(&opts.author, "author", "a", "", "执行提交操作的作者 (比如, \"张三 <hannibal@a-team.com>\")")
    51  
    52  	opts.changes = dockeropts.NewListOpts(nil)
    53  	flags.VarP(&opts.changes, "change", "c", "在创建的镜像中添加Dockerfile中的指令")
    54  
    55  	// FIXME: --run is deprecated, it will be replaced with inline Dockerfile commands.
    56  	flags.StringVar(&opts.config, "run", "", "该参数已经被废弃,并会在未来的版本中被移除")
    57  	flags.MarkDeprecated("run", "此选项将来会被Dockerfile内部的命令所替代")
    58  
    59  	return cmd
    60  }
    61  
    62  func runCommit(dockerCli *client.DockerCli, opts *commitOptions) error {
    63  	ctx := context.Background()
    64  
    65  	name := opts.container
    66  	reference := opts.reference
    67  
    68  	var config *containertypes.Config
    69  	if opts.config != "" {
    70  		config = &containertypes.Config{}
    71  		if err := json.Unmarshal([]byte(opts.config), config); err != nil {
    72  			return err
    73  		}
    74  	}
    75  
    76  	options := types.ContainerCommitOptions{
    77  		Reference: reference,
    78  		Comment:   opts.comment,
    79  		Author:    opts.author,
    80  		Changes:   opts.changes.GetAll(),
    81  		Pause:     opts.pause,
    82  		Config:    config,
    83  	}
    84  
    85  	response, err := dockerCli.Client().ContainerCommit(ctx, name, options)
    86  	if err != nil {
    87  		return err
    88  	}
    89  
    90  	fmt.Fprintln(dockerCli.Out(), response.ID)
    91  	return nil
    92  }