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 }