github.com/yuyangjack/moby@v0.0.0-20190814082046-288be08dc2ec/daemon/image.go (about) 1 package daemon 2 3 import ( 4 "fmt" 5 6 "github.com/docker/docker/builder" 7 "github.com/docker/docker/image" 8 "github.com/docker/docker/pkg/stringid" 9 "github.com/docker/docker/reference" 10 ) 11 12 // ErrImageDoesNotExist is error returned when no image can be found for a reference. 13 type ErrImageDoesNotExist struct { 14 RefOrID string 15 } 16 17 func (e ErrImageDoesNotExist) Error() string { 18 return fmt.Sprintf("no such id: %s", e.RefOrID) 19 } 20 21 // GetImageID returns an image ID corresponding to the image referred to by 22 // refOrID. 23 func (daemon *Daemon) GetImageID(refOrID string) (image.ID, error) { 24 id, ref, err := reference.ParseIDOrReference(refOrID) 25 if err != nil { 26 return "", err 27 } 28 if id != "" { 29 if _, err := daemon.imageStore.Get(image.IDFromDigest(id)); err != nil { 30 return "", ErrImageDoesNotExist{refOrID} 31 } 32 return image.IDFromDigest(id), nil 33 } 34 35 if id, err := daemon.referenceStore.Get(ref); err == nil { 36 return image.IDFromDigest(id), nil 37 } 38 39 // deprecated: repo:shortid https://github.com/docker/docker/pull/799 40 if tagged, ok := ref.(reference.NamedTagged); ok { 41 if tag := tagged.Tag(); stringid.IsShortID(stringid.TruncateID(tag)) { 42 if id, err := daemon.imageStore.Search(tag); err == nil { 43 for _, namedRef := range daemon.referenceStore.References(id.Digest()) { 44 if namedRef.Name() == ref.Name() { 45 return id, nil 46 } 47 } 48 } 49 } 50 } 51 52 // Search based on ID 53 if id, err := daemon.imageStore.Search(refOrID); err == nil { 54 return id, nil 55 } 56 57 return "", ErrImageDoesNotExist{refOrID} 58 } 59 60 // GetImage returns an image corresponding to the image referred to by refOrID. 61 func (daemon *Daemon) GetImage(refOrID string) (*image.Image, error) { 62 imgID, err := daemon.GetImageID(refOrID) 63 if err != nil { 64 return nil, err 65 } 66 return daemon.imageStore.Get(imgID) 67 } 68 69 // GetImageOnBuild looks up a Docker image referenced by `name`. 70 func (daemon *Daemon) GetImageOnBuild(name string) (builder.Image, error) { 71 img, err := daemon.GetImage(name) 72 if err != nil { 73 return nil, err 74 } 75 return img, nil 76 }