github.com/rhatdan/docker@v0.7.7-0.20180119204836-47a0dcbcd20a/daemon/image_inspect.go (about)

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