2015-03-24 23:57:23 -04:00
package client
import (
2015-12-09 12:03:09 -05:00
"encoding/json"
2015-03-24 23:57:23 -04:00
"fmt"
2016-03-16 15:19:22 -04:00
"golang.org/x/net/context"
2015-05-05 00:18:28 -04:00
Cli "github.com/docker/docker/cli"
2015-03-24 23:57:23 -04:00
"github.com/docker/docker/opts"
flag "github.com/docker/docker/pkg/mflag"
2016-01-04 19:05:26 -05:00
"github.com/docker/engine-api/types"
"github.com/docker/engine-api/types/container"
2015-03-24 23:57:23 -04:00
)
2015-03-25 19:26:28 -04:00
// CmdCommit creates a new image from a container's changes.
2015-03-25 13:34:41 -04:00
//
2015-03-25 19:26:28 -04:00
// Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
2015-03-24 23:57:23 -04:00
func ( cli * DockerCli ) CmdCommit ( args ... string ) error {
2015-10-08 08:46:21 -04:00
cmd := Cli . Subcmd ( "commit" , [ ] string { "CONTAINER [REPOSITORY[:TAG]]" } , Cli . DockerCommands [ "commit" ] . Description , true )
2015-03-24 23:57:23 -04:00
flPause := cmd . Bool ( [ ] string { "p" , "-pause" } , true , "Pause container during commit" )
flComment := cmd . String ( [ ] string { "m" , "-message" } , "" , "Commit message" )
2015-11-09 09:37:24 -05:00
flAuthor := cmd . String ( [ ] string { "a" , "-author" } , "" , "Author (e.g., \"John Hannibal Smith <hannibal@a-team.com>\")" )
2015-03-24 23:57:23 -04:00
flChanges := opts . NewListOpts ( nil )
cmd . Var ( & flChanges , [ ] string { "c" , "-change" } , "Apply Dockerfile instruction to the created image" )
// FIXME: --run is deprecated, it will be replaced with inline Dockerfile commands.
2015-11-09 09:37:24 -05:00
flConfig := cmd . String ( [ ] string { "#-run" } , "" , "This option is deprecated and will be removed in a future version in favor of inline Dockerfile-compatible commands" )
2015-03-24 23:57:23 -04:00
cmd . Require ( flag . Max , 2 )
cmd . Require ( flag . Min , 1 )
2015-07-03 05:26:09 -04:00
2015-03-28 21:22:46 -04:00
cmd . ParseFlags ( args , true )
2015-03-24 23:57:23 -04:00
var (
2016-04-13 04:33:46 -04:00
name = cmd . Arg ( 0 )
reference = cmd . Arg ( 1 )
2015-03-24 23:57:23 -04:00
)
2015-12-18 13:36:17 -05:00
var config * container . Config
2015-12-09 12:03:09 -05:00
if * flConfig != "" {
2015-12-18 13:36:17 -05:00
config = & container . Config { }
2015-12-09 12:03:09 -05:00
if err := json . Unmarshal ( [ ] byte ( * flConfig ) , config ) ; err != nil {
return err
}
}
2015-12-04 17:02:06 -05:00
options := types . ContainerCommitOptions {
2016-04-13 04:33:46 -04:00
Reference : reference ,
Comment : * flComment ,
Author : * flAuthor ,
Changes : flChanges . GetAll ( ) ,
Pause : * flPause ,
Config : config ,
2015-03-24 23:57:23 -04:00
}
2016-04-13 04:33:46 -04:00
response , err := cli . client . ContainerCommit ( context . Background ( ) , name , options )
2015-03-24 23:57:23 -04:00
if err != nil {
return err
}
2015-03-28 12:39:24 -04:00
fmt . Fprintln ( cli . out , response . ID )
2015-03-24 23:57:23 -04:00
return nil
}