github.com/LazyboyChen7/engine@v17.12.1-ce-rc2+incompatible/daemon/image_push.go (about)

     1  package daemon
     2  
     3  import (
     4  	"io"
     5  	"runtime"
     6  
     7  	"github.com/docker/distribution/manifest/schema2"
     8  	"github.com/docker/distribution/reference"
     9  	"github.com/docker/docker/api/types"
    10  	"github.com/docker/docker/distribution"
    11  	progressutils "github.com/docker/docker/distribution/utils"
    12  	"github.com/docker/docker/pkg/progress"
    13  	"github.com/docker/docker/pkg/system"
    14  	"golang.org/x/net/context"
    15  )
    16  
    17  // PushImage initiates a push operation on the repository named localName.
    18  func (daemon *Daemon) PushImage(ctx context.Context, image, tag string, metaHeaders map[string][]string, authConfig *types.AuthConfig, outStream io.Writer) error {
    19  	ref, err := reference.ParseNormalizedNamed(image)
    20  	if err != nil {
    21  		return err
    22  	}
    23  	if tag != "" {
    24  		// Push by digest is not supported, so only tags are supported.
    25  		ref, err = reference.WithTag(ref, tag)
    26  		if err != nil {
    27  			return err
    28  		}
    29  	}
    30  
    31  	// Include a buffer so that slow client connections don't affect
    32  	// transfer performance.
    33  	progressChan := make(chan progress.Progress, 100)
    34  
    35  	writesDone := make(chan struct{})
    36  
    37  	ctx, cancelFunc := context.WithCancel(ctx)
    38  
    39  	go func() {
    40  		progressutils.WriteDistributionProgress(cancelFunc, outStream, progressChan)
    41  		close(writesDone)
    42  	}()
    43  
    44  	// TODO @jhowardmsft LCOW Support. This will require revisiting. For now, hard-code.
    45  	platform := runtime.GOOS
    46  	if system.LCOWSupported() {
    47  		platform = "linux"
    48  	}
    49  
    50  	imagePushConfig := &distribution.ImagePushConfig{
    51  		Config: distribution.Config{
    52  			MetaHeaders:      metaHeaders,
    53  			AuthConfig:       authConfig,
    54  			ProgressOutput:   progress.ChanOutput(progressChan),
    55  			RegistryService:  daemon.RegistryService,
    56  			ImageEventLogger: daemon.LogImageEvent,
    57  			MetadataStore:    daemon.stores[platform].distributionMetadataStore,
    58  			ImageStore:       distribution.NewImageConfigStoreFromStore(daemon.stores[platform].imageStore),
    59  			ReferenceStore:   daemon.referenceStore,
    60  		},
    61  		ConfigMediaType: schema2.MediaTypeImageConfig,
    62  		LayerStore:      distribution.NewLayerProviderFromStore(daemon.stores[platform].layerStore),
    63  		TrustKey:        daemon.trustKey,
    64  		UploadManager:   daemon.uploadManager,
    65  	}
    66  
    67  	err = distribution.Push(ctx, ref, imagePushConfig)
    68  	close(progressChan)
    69  	<-writesDone
    70  	return err
    71  }