container_commit.go 1.5 KB

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