client/container_commit.go
7c36a1af
 package client
 
 import (
 	"encoding/json"
 	"errors"
 	"net/url"
 
 	distreference "github.com/docker/distribution/reference"
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types/reference"
 	"golang.org/x/net/context"
 )
 
 // ContainerCommit applies changes into a container and creates a new tagged image.
c8d5e720
 func (cli *Client) ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.IDResponse, error) {
7c36a1af
 	var repository, tag string
 	if options.Reference != "" {
 		distributionRef, err := distreference.ParseNamed(options.Reference)
 		if err != nil {
c8d5e720
 			return types.IDResponse{}, err
7c36a1af
 		}
 
 		if _, isCanonical := distributionRef.(distreference.Canonical); isCanonical {
c8d5e720
 			return types.IDResponse{}, errors.New("refusing to create a tag with a digest reference")
7c36a1af
 		}
 
 		tag = reference.GetTagFromNamedRef(distributionRef)
 		repository = distributionRef.Name()
 	}
 
 	query := url.Values{}
 	query.Set("container", container)
 	query.Set("repo", repository)
 	query.Set("tag", tag)
 	query.Set("comment", options.Comment)
 	query.Set("author", options.Author)
 	for _, change := range options.Changes {
 		query.Add("changes", change)
 	}
 	if options.Pause != true {
 		query.Set("pause", "0")
 	}
 
c8d5e720
 	var response types.IDResponse
7c36a1af
 	resp, err := cli.post(ctx, "/commit", query, options.Config, nil)
 	if err != nil {
 		return response, err
 	}
 
 	err = json.NewDecoder(resp.body).Decode(&response)
 	ensureReaderClosed(resp)
 	return response, err
 }