2016-06-06 10:57:44 -04:00
package container
import (
"encoding/json"
"fmt"
"golang.org/x/net/context"
"github.com/docker/docker/api/client"
"github.com/docker/docker/cli"
dockeropts "github.com/docker/docker/opts"
"github.com/docker/engine-api/types"
containertypes "github.com/docker/engine-api/types/container"
"github.com/spf13/cobra"
)
type commitOptions struct {
container string
reference string
pause bool
comment string
author string
changes dockeropts . ListOpts
config string
}
2016-07-16 05:55:18 -04:00
// NewCommitCommand creates a new cobra.Command for `docker commit`
2016-06-06 10:57:44 -04:00
func NewCommitCommand ( dockerCli * client . DockerCli ) * cobra . Command {
var opts commitOptions
cmd := & cobra . Command {
Use : "commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]" ,
Short : "Create a new image from a container's changes" ,
Args : cli . RequiresRangeArgs ( 1 , 2 ) ,
RunE : func ( cmd * cobra . Command , args [ ] string ) error {
opts . container = args [ 0 ]
if len ( args ) > 1 {
opts . reference = args [ 1 ]
}
return runCommit ( dockerCli , & opts )
} ,
}
cmd . SetFlagErrorFunc ( flagErrorFunc )
flags := cmd . Flags ( )
flags . SetInterspersed ( false )
flags . BoolVarP ( & opts . pause , "pause" , "p" , true , "Pause container during commit" )
flags . StringVarP ( & opts . comment , "message" , "m" , "" , "Commit message" )
flags . StringVarP ( & opts . author , "author" , "a" , "" , "Author (e.g., \"John Hannibal Smith <hannibal@a-team.com>\")" )
opts . changes = dockeropts . NewListOpts ( nil )
flags . VarP ( & opts . changes , "change" , "c" , "Apply Dockerfile instruction to the created image" )
// FIXME: --run is deprecated, it will be replaced with inline Dockerfile commands.
flags . StringVar ( & opts . config , "run" , "" , "This option is deprecated and will be removed in a future version in favor of inline Dockerfile-compatible commands" )
flags . MarkDeprecated ( "run" , "it will be replaced with inline Dockerfile commands." )
return cmd
}
func runCommit ( dockerCli * client . DockerCli , opts * commitOptions ) error {
ctx := context . Background ( )
name := opts . container
reference := opts . reference
var config * containertypes . Config
if opts . config != "" {
config = & containertypes . Config { }
if err := json . Unmarshal ( [ ] byte ( opts . config ) , config ) ; err != nil {
return err
}
}
options := types . ContainerCommitOptions {
Reference : reference ,
Comment : opts . comment ,
Author : opts . author ,
Changes : opts . changes . GetAll ( ) ,
Pause : opts . pause ,
Config : config ,
}
response , err := dockerCli . Client ( ) . ContainerCommit ( ctx , name , options )
if err != nil {
return err
}
fmt . Fprintln ( dockerCli . Out ( ) , response . ID )
return nil
}