Skip to content

Commit 2a2ea09

Browse files
committed
resolver: allow reference matches for local image lookups
When looking up local images from container image store, Get() method only accepts direct name matches. This means that when image name is sent together with a digest value, it is not matched because containerd would expect digest to be part of the image name. Signed-off-by: Tonis Tiigi <[email protected]> (cherry picked from commit 43580f9)
1 parent 7fdda10 commit 2a2ea09

File tree

1 file changed

+27
-2
lines changed

1 file changed

+27
-2
lines changed

util/resolver/pool.go

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/containerd/containerd/v2/core/images"
1313
"github.com/containerd/containerd/v2/core/remotes"
1414
"github.com/containerd/containerd/v2/core/remotes/docker"
15+
cerrdefs "github.com/containerd/errdefs"
1516
distreference "github.com/distribution/reference"
1617
"github.com/moby/buildkit/session"
1718
"github.com/moby/buildkit/solver/pb"
@@ -225,7 +226,7 @@ func (r *Resolver) Fetcher(ctx context.Context, ref string) (remotes.Fetcher, er
225226
// Resolve attempts to resolve the reference into a name and descriptor.
226227
func (r *Resolver) Resolve(ctx context.Context, ref string) (string, ocispecs.Descriptor, error) {
227228
if r.mode == ResolveModePreferLocal && r.is != nil {
228-
if img, err := r.is.Get(ctx, ref); err == nil {
229+
if img, err := getImageByRef(ctx, r.is, ref); err == nil {
229230
return ref, img.Target, nil
230231
}
231232
}
@@ -237,14 +238,38 @@ func (r *Resolver) Resolve(ctx context.Context, ref string) (string, ocispecs.De
237238
}
238239

239240
if r.mode == ResolveModeDefault && r.is != nil {
240-
if img, err := r.is.Get(ctx, ref); err == nil {
241+
if img, err := getImageByRef(ctx, r.is, ref); err == nil {
241242
return ref, img.Target, nil
242243
}
243244
}
244245

245246
return "", ocispecs.Descriptor{}, err
246247
}
247248

249+
func getImageByRef(ctx context.Context, is images.Store, ref string) (images.Image, error) {
250+
named, err := distreference.ParseNormalizedNamed(ref)
251+
if err != nil {
252+
return images.Image{}, err
253+
}
254+
255+
name := named.Name()
256+
tag := "latest"
257+
if t, ok := named.(distreference.Tagged); ok {
258+
tag = t.Tag()
259+
}
260+
name = name + ":" + tag
261+
img, err := is.Get(ctx, name)
262+
if err != nil {
263+
return images.Image{}, err
264+
}
265+
if c, ok := named.(distreference.Canonical); ok {
266+
if img.Target.Digest != c.Digest() {
267+
return images.Image{}, errors.WithStack(cerrdefs.ErrNotFound)
268+
}
269+
}
270+
return img, nil
271+
}
272+
248273
type ResolveMode int
249274

250275
const (

0 commit comments

Comments
 (0)