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  }