github.com/docker/docker@v299999999.0.0-20200612211812-aaf470eca7b5+incompatible/daemon/images/image_inspect.go (about)

     1  package images // import "github.com/docker/docker/daemon/images"
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/docker/distribution/reference"
     7  	"github.com/docker/docker/api/types"
     8  	"github.com/docker/docker/image"
     9  	"github.com/docker/docker/layer"
    10  	"github.com/docker/docker/pkg/system"
    11  	"github.com/pkg/errors"
    12  )
    13  
    14  // LookupImage looks up an image by name and returns it as an ImageInspect
    15  // structure.
    16  func (i *ImageService) LookupImage(name string) (*types.ImageInspect, error) {
    17  	img, err := i.GetImage(name, nil)
    18  	if err != nil {
    19  		return nil, errors.Wrapf(err, "no such image: %s", name)
    20  	}
    21  	if !system.IsOSSupported(img.OperatingSystem()) {
    22  		return nil, system.ErrNotSupportedOperatingSystem
    23  	}
    24  	refs := i.referenceStore.References(img.ID().Digest())
    25  	repoTags := []string{}
    26  	repoDigests := []string{}
    27  	for _, ref := range refs {
    28  		switch ref.(type) {
    29  		case reference.NamedTagged:
    30  			repoTags = append(repoTags, reference.FamiliarString(ref))
    31  		case reference.Canonical:
    32  			repoDigests = append(repoDigests, reference.FamiliarString(ref))
    33  		}
    34  	}
    35  
    36  	var size int64
    37  	var layerMetadata map[string]string
    38  	layerID := img.RootFS.ChainID()
    39  	if layerID != "" {
    40  		l, err := i.layerStores[img.OperatingSystem()].Get(layerID)
    41  		if err != nil {
    42  			return nil, err
    43  		}
    44  		defer layer.ReleaseAndLog(i.layerStores[img.OperatingSystem()], l)
    45  		size, err = l.Size()
    46  		if err != nil {
    47  			return nil, err
    48  		}
    49  
    50  		layerMetadata, err = l.Metadata()
    51  		if err != nil {
    52  			return nil, err
    53  		}
    54  	}
    55  
    56  	comment := img.Comment
    57  	if len(comment) == 0 && len(img.History) > 0 {
    58  		comment = img.History[len(img.History)-1].Comment
    59  	}
    60  
    61  	lastUpdated, err := i.imageStore.GetLastUpdated(img.ID())
    62  	if err != nil {
    63  		return nil, err
    64  	}
    65  
    66  	imageInspect := &types.ImageInspect{
    67  		ID:              img.ID().String(),
    68  		RepoTags:        repoTags,
    69  		RepoDigests:     repoDigests,
    70  		Parent:          img.Parent.String(),
    71  		Comment:         comment,
    72  		Created:         img.Created.Format(time.RFC3339Nano),
    73  		Container:       img.Container,
    74  		ContainerConfig: &img.ContainerConfig,
    75  		DockerVersion:   img.DockerVersion,
    76  		Author:          img.Author,
    77  		Config:          img.Config,
    78  		Architecture:    img.Architecture,
    79  		Variant:         img.Variant,
    80  		Os:              img.OperatingSystem(),
    81  		OsVersion:       img.OSVersion,
    82  		Size:            size,
    83  		VirtualSize:     size, // TODO: field unused, deprecate
    84  		RootFS:          rootFSToAPIType(img.RootFS),
    85  		Metadata: types.ImageMetadata{
    86  			LastTagTime: lastUpdated,
    87  		},
    88  	}
    89  
    90  	imageInspect.GraphDriver.Name = i.layerStores[img.OperatingSystem()].DriverName()
    91  	imageInspect.GraphDriver.Data = layerMetadata
    92  
    93  	return imageInspect, nil
    94  }
    95  
    96  func rootFSToAPIType(rootfs *image.RootFS) types.RootFS {
    97  	var layers []string
    98  	for _, l := range rootfs.DiffIDs {
    99  		layers = append(layers, l.String())
   100  	}
   101  	return types.RootFS{
   102  		Type:   rootfs.Type,
   103  		Layers: layers,
   104  	}
   105  }