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  }