github.com/jiasir/docker@v1.3.3-0.20170609024000-252e610103e7/daemon/image.go (about) 1 package daemon 2 3 import ( 4 "fmt" 5 6 "github.com/docker/distribution/reference" 7 "github.com/docker/docker/image" 8 "github.com/docker/docker/pkg/stringid" 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 // GetImageID returns an image ID corresponding to the image referred to by 25 // refOrID. 26 func (daemon *Daemon) GetImageID(refOrID string) (image.ID, error) { 27 ref, err := reference.ParseAnyReference(refOrID) 28 if err != nil { 29 return "", err 30 } 31 namedRef, ok := ref.(reference.Named) 32 if !ok { 33 digested, ok := ref.(reference.Digested) 34 if !ok { 35 return "", ErrImageDoesNotExist{ref} 36 } 37 id := image.IDFromDigest(digested.Digest()) 38 if _, err := daemon.imageStore.Get(id); err != nil { 39 return "", ErrImageDoesNotExist{ref} 40 } 41 return id, nil 42 } 43 44 if id, err := daemon.referenceStore.Get(namedRef); err == nil { 45 return image.IDFromDigest(id), nil 46 } 47 48 // deprecated: repo:shortid https://github.com/docker/docker/pull/799 49 if tagged, ok := namedRef.(reference.Tagged); ok { 50 if tag := tagged.Tag(); stringid.IsShortID(stringid.TruncateID(tag)) { 51 if id, err := daemon.imageStore.Search(tag); err == nil { 52 for _, storeRef := range daemon.referenceStore.References(id.Digest()) { 53 if storeRef.Name() == namedRef.Name() { 54 return id, nil 55 } 56 } 57 } 58 } 59 } 60 61 // Search based on ID 62 if id, err := daemon.imageStore.Search(refOrID); err == nil { 63 return id, nil 64 } 65 66 return "", ErrImageDoesNotExist{ref} 67 } 68 69 // GetImage returns an image corresponding to the image referred to by refOrID. 70 func (daemon *Daemon) GetImage(refOrID string) (*image.Image, error) { 71 imgID, err := daemon.GetImageID(refOrID) 72 if err != nil { 73 return nil, err 74 } 75 return daemon.imageStore.Get(imgID) 76 }