github.com/rish1988/moby@v25.0.2+incompatible/client/container_commit.go (about) 1 package client // import "github.com/docker/docker/client" 2 3 import ( 4 "context" 5 "encoding/json" 6 "errors" 7 "net/url" 8 9 "github.com/distribution/reference" 10 "github.com/docker/docker/api/types" 11 "github.com/docker/docker/api/types/container" 12 ) 13 14 // ContainerCommit applies changes to a container and creates a new tagged image. 15 func (cli *Client) ContainerCommit(ctx context.Context, container string, options container.CommitOptions) (types.IDResponse, error) { 16 var repository, tag string 17 if options.Reference != "" { 18 ref, err := reference.ParseNormalizedNamed(options.Reference) 19 if err != nil { 20 return types.IDResponse{}, err 21 } 22 23 if _, isCanonical := ref.(reference.Canonical); isCanonical { 24 return types.IDResponse{}, errors.New("refusing to create a tag with a digest reference") 25 } 26 ref = reference.TagNameOnly(ref) 27 28 if tagged, ok := ref.(reference.Tagged); ok { 29 tag = tagged.Tag() 30 } 31 repository = reference.FamiliarName(ref) 32 } 33 34 query := url.Values{} 35 query.Set("container", container) 36 query.Set("repo", repository) 37 query.Set("tag", tag) 38 query.Set("comment", options.Comment) 39 query.Set("author", options.Author) 40 for _, change := range options.Changes { 41 query.Add("changes", change) 42 } 43 if !options.Pause { 44 query.Set("pause", "0") 45 } 46 47 var response types.IDResponse 48 resp, err := cli.post(ctx, "/commit", query, options.Config, nil) 49 defer ensureReaderClosed(resp) 50 if err != nil { 51 return response, err 52 } 53 54 err = json.NewDecoder(resp.body).Decode(&response) 55 return response, err 56 }