Move configurations into a single file. Abstract download manager in pull config. Add supports for schema2 only and schema2 type checking. Add interface for providing push layers. Abstract image store to generically handle configurations. Signed-off-by: Derek McGowan <derek@mcgstyle.net> Upstream-commit: 3c7676a057a4c0103895f793e407dc6736df139a Component: engine
63 lines
1.8 KiB
Go
63 lines
1.8 KiB
Go
package daemon
|
|
|
|
import (
|
|
"io"
|
|
|
|
"github.com/docker/distribution/manifest/schema2"
|
|
"github.com/docker/docker/api/types"
|
|
"github.com/docker/docker/distribution"
|
|
"github.com/docker/docker/pkg/progress"
|
|
"github.com/docker/docker/reference"
|
|
"golang.org/x/net/context"
|
|
)
|
|
|
|
// PushImage initiates a push operation on the repository named localName.
|
|
func (daemon *Daemon) PushImage(ctx context.Context, image, tag string, metaHeaders map[string][]string, authConfig *types.AuthConfig, outStream io.Writer) error {
|
|
ref, err := reference.ParseNamed(image)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if tag != "" {
|
|
// Push by digest is not supported, so only tags are supported.
|
|
ref, err = reference.WithTag(ref, tag)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
// Include a buffer so that slow client connections don't affect
|
|
// transfer performance.
|
|
progressChan := make(chan progress.Progress, 100)
|
|
|
|
writesDone := make(chan struct{})
|
|
|
|
ctx, cancelFunc := context.WithCancel(ctx)
|
|
|
|
go func() {
|
|
writeDistributionProgress(cancelFunc, outStream, progressChan)
|
|
close(writesDone)
|
|
}()
|
|
|
|
imagePushConfig := &distribution.ImagePushConfig{
|
|
Config: distribution.Config{
|
|
MetaHeaders: metaHeaders,
|
|
AuthConfig: authConfig,
|
|
ProgressOutput: progress.ChanOutput(progressChan),
|
|
RegistryService: daemon.RegistryService,
|
|
ImageEventLogger: daemon.LogImageEvent,
|
|
MetadataStore: daemon.distributionMetadataStore,
|
|
ImageStore: distribution.NewImageConfigStoreFromStore(daemon.imageStore),
|
|
ReferenceStore: daemon.referenceStore,
|
|
},
|
|
ConfigMediaType: schema2.MediaTypeImageConfig,
|
|
LayerStore: distribution.NewLayerProviderFromStore(daemon.layerStore),
|
|
TrustKey: daemon.trustKey,
|
|
UploadManager: daemon.uploadManager,
|
|
}
|
|
|
|
err = distribution.Push(ctx, ref, imagePushConfig)
|
|
close(progressChan)
|
|
<-writesDone
|
|
return err
|
|
}
|