in ecr/resolver.go [304:332]
func (r *ecrResolver) Pusher(ctx context.Context, ref string) (remotes.Pusher, error) {
log.G(ctx).WithField("ref", ref).Debug("ecr.resolver.pusher")
ecrSpec, err := ParseRef(ref)
if err != nil {
return nil, err
}
// References will include a digest when the ref is being pushed to a tag to
// denote *which* digest is the root descriptor in this push.
tag, digest := ecrSpec.TagDigest()
if tag == "" && digest != "" {
log.G(ctx).WithField("ref", ref).Debug("ecr.resolver.pusher: push by digest")
}
// The root descriptor's digest *must* be provided in order to properly tag
// manifests. A ref string will provide this as of containerd v1.3.0 -
// earlier versions do not provide it.
if digest == "" {
return nil, errors.New("pusher: root descriptor missing from push reference")
}
return &ecrPusher{
ecrBase: ecrBase{
client: r.getClient(ecrSpec.Region()),
ecrSpec: ecrSpec,
},
tracker: r.tracker,
}, nil
}