container_commit.go 1.4 KB

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