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  }