image_push.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package daemon
  2. import (
  3. "io"
  4. "github.com/docker/docker/distribution"
  5. "github.com/docker/docker/pkg/progress"
  6. "github.com/docker/docker/reference"
  7. "github.com/docker/engine-api/types"
  8. "golang.org/x/net/context"
  9. )
  10. // PushImage initiates a push operation on the repository named localName.
  11. func (daemon *Daemon) PushImage(ctx context.Context, image, tag string, metaHeaders map[string][]string, authConfig *types.AuthConfig, outStream io.Writer) error {
  12. ref, err := reference.ParseNamed(image)
  13. if err != nil {
  14. return err
  15. }
  16. if tag != "" {
  17. // Push by digest is not supported, so only tags are supported.
  18. ref, err = reference.WithTag(ref, tag)
  19. if err != nil {
  20. return err
  21. }
  22. }
  23. // Include a buffer so that slow client connections don't affect
  24. // transfer performance.
  25. progressChan := make(chan progress.Progress, 100)
  26. writesDone := make(chan struct{})
  27. ctx, cancelFunc := context.WithCancel(ctx)
  28. go func() {
  29. writeDistributionProgress(cancelFunc, outStream, progressChan)
  30. close(writesDone)
  31. }()
  32. imagePushConfig := &distribution.ImagePushConfig{
  33. MetaHeaders: metaHeaders,
  34. AuthConfig: authConfig,
  35. ProgressOutput: progress.ChanOutput(progressChan),
  36. RegistryService: daemon.RegistryService,
  37. ImageEventLogger: daemon.LogImageEvent,
  38. MetadataStore: daemon.distributionMetadataStore,
  39. LayerStore: daemon.layerStore,
  40. ImageStore: daemon.imageStore,
  41. ReferenceStore: daemon.referenceStore,
  42. TrustKey: daemon.trustKey,
  43. UploadManager: daemon.uploadManager,
  44. }
  45. err = distribution.Push(ctx, ref, imagePushConfig)
  46. close(progressChan)
  47. <-writesDone
  48. return err
  49. }