From 1157c8047ee016237d72b4c195736acf9711d1aa Mon Sep 17 00:00:00 2001 From: Aaron Lehmann Date: Mon, 15 May 2017 17:17:27 -0700 Subject: [PATCH] Prefer digest over tag on pull If a reference passed to the pull code contains both a tag and a digest, currently the tag is used instead of the digest in the request to the registry. This is the wrong behavior. Change it to favor the digest. Signed-off-by: Aaron Lehmann Upstream-commit: 0bff591bb0bc5a11ec22eb4f0b6104a79dea0819 Component: engine --- components/engine/distribution/pull_v2.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/components/engine/distribution/pull_v2.go b/components/engine/distribution/pull_v2.go index 1d6c356b78..08df6b768f 100644 --- a/components/engine/distribution/pull_v2.go +++ b/components/engine/distribution/pull_v2.go @@ -334,18 +334,18 @@ func (p *v2Puller) pullV2Tag(ctx context.Context, ref reference.Named) (tagUpdat manifest distribution.Manifest tagOrDigest string // Used for logging/progress only ) - if tagged, isTagged := ref.(reference.NamedTagged); isTagged { - manifest, err = manSvc.Get(ctx, "", distribution.WithTag(tagged.Tag())) - if err != nil { - return false, allowV1Fallback(err) - } - tagOrDigest = tagged.Tag() - } else if digested, isDigested := ref.(reference.Canonical); isDigested { + if digested, isDigested := ref.(reference.Canonical); isDigested { manifest, err = manSvc.Get(ctx, digested.Digest()) if err != nil { return false, err } tagOrDigest = digested.Digest().String() + } else if tagged, isTagged := ref.(reference.NamedTagged); isTagged { + manifest, err = manSvc.Get(ctx, "", distribution.WithTag(tagged.Tag())) + if err != nil { + return false, allowV1Fallback(err) + } + tagOrDigest = tagged.Tag() } else { return false, fmt.Errorf("internal error: reference has neither a tag nor a digest: %s", reference.FamiliarString(ref)) }