image_push.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package images // import "github.com/docker/docker/daemon/images"
  2. import (
  3. "context"
  4. "io"
  5. "time"
  6. "github.com/distribution/reference"
  7. "github.com/docker/distribution/manifest/schema2"
  8. "github.com/docker/docker/api/types/registry"
  9. "github.com/docker/docker/distribution"
  10. progressutils "github.com/docker/docker/distribution/utils"
  11. "github.com/docker/docker/pkg/progress"
  12. )
  13. // PushImage initiates a push operation on the repository named localName.
  14. func (i *ImageService) PushImage(ctx context.Context, ref reference.Named, metaHeaders map[string][]string, authConfig *registry.AuthConfig, outStream io.Writer) error {
  15. start := time.Now()
  16. // Include a buffer so that slow client connections don't affect
  17. // transfer performance.
  18. progressChan := make(chan progress.Progress, 100)
  19. writesDone := make(chan struct{})
  20. ctx, cancelFunc := context.WithCancel(ctx)
  21. go func() {
  22. progressutils.WriteDistributionProgress(cancelFunc, outStream, progressChan)
  23. close(writesDone)
  24. }()
  25. imagePushConfig := &distribution.ImagePushConfig{
  26. Config: distribution.Config{
  27. MetaHeaders: metaHeaders,
  28. AuthConfig: authConfig,
  29. ProgressOutput: progress.ChanOutput(progressChan),
  30. RegistryService: i.registryService,
  31. ImageEventLogger: i.LogImageEvent,
  32. MetadataStore: i.distributionMetadataStore,
  33. ImageStore: distribution.NewImageConfigStoreFromStore(i.imageStore),
  34. ReferenceStore: i.referenceStore,
  35. },
  36. ConfigMediaType: schema2.MediaTypeImageConfig,
  37. LayerStores: distribution.NewLayerProvidersFromStore(i.layerStore),
  38. UploadManager: i.uploadManager,
  39. }
  40. err := distribution.Push(ctx, ref, imagePushConfig)
  41. close(progressChan)
  42. <-writesDone
  43. imageActions.WithValues("push").UpdateSince(start)
  44. return err
  45. }