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