github.com/demonoid81/moby@v0.0.0-20200517203328-62dd8e17c460/daemon/images/image.go (about) 1 package images // import "github.com/demonoid81/moby/daemon/images" 2 3 import ( 4 "fmt" 5 6 "github.com/docker/distribution/reference" 7 "github.com/demonoid81/moby/errdefs" 8 "github.com/demonoid81/moby/image" 9 ) 10 11 // ErrImageDoesNotExist is error returned when no image can be found for a reference. 12 type ErrImageDoesNotExist struct { 13 ref reference.Reference 14 } 15 16 func (e ErrImageDoesNotExist) Error() string { 17 ref := e.ref 18 if named, ok := ref.(reference.Named); ok { 19 ref = reference.TagNameOnly(named) 20 } 21 return fmt.Sprintf("No such image: %s", reference.FamiliarString(ref)) 22 } 23 24 // NotFound implements the NotFound interface 25 func (e ErrImageDoesNotExist) NotFound() {} 26 27 // GetImage returns an image corresponding to the image referred to by refOrID. 28 func (i *ImageService) GetImage(refOrID string) (*image.Image, error) { 29 ref, err := reference.ParseAnyReference(refOrID) 30 if err != nil { 31 return nil, errdefs.InvalidParameter(err) 32 } 33 namedRef, ok := ref.(reference.Named) 34 if !ok { 35 digested, ok := ref.(reference.Digested) 36 if !ok { 37 return nil, ErrImageDoesNotExist{ref} 38 } 39 id := image.IDFromDigest(digested.Digest()) 40 if img, err := i.imageStore.Get(id); err == nil { 41 return img, nil 42 } 43 return nil, ErrImageDoesNotExist{ref} 44 } 45 46 if digest, err := i.referenceStore.Get(namedRef); err == nil { 47 // Search the image stores to get the operating system, defaulting to host OS. 48 id := image.IDFromDigest(digest) 49 if img, err := i.imageStore.Get(id); err == nil { 50 return img, nil 51 } 52 } 53 54 // Search based on ID 55 if id, err := i.imageStore.Search(refOrID); err == nil { 56 img, err := i.imageStore.Get(id) 57 if err != nil { 58 return nil, ErrImageDoesNotExist{ref} 59 } 60 return img, nil 61 } 62 63 return nil, ErrImageDoesNotExist{ref} 64 }