github.com/ssdev-go/moby@v17.12.1-ce-rc2+incompatible/daemon/image_inspect.go (about)

     1  package daemon
     2  
     3  import (
     4  	"runtime"
     5  	"time"
     6  
     7  	"github.com/docker/distribution/reference"
     8  	"github.com/docker/docker/api/types"
     9  	"github.com/docker/docker/layer"
    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  
    21  	// If the image OS isn't set, assume it's the host OS
    22  	platform := img.OS
    23  	if platform == "" {
    24  		platform = runtime.GOOS
    25  	}
    26  
    27  	refs := daemon.referenceStore.References(img.ID().Digest())
    28  	repoTags := []string{}
    29  	repoDigests := []string{}
    30  	for _, ref := range refs {
    31  		switch ref.(type) {
    32  		case reference.NamedTagged:
    33  			repoTags = append(repoTags, reference.FamiliarString(ref))
    34  		case reference.Canonical:
    35  			repoDigests = append(repoDigests, reference.FamiliarString(ref))
    36  		}
    37  	}
    38  
    39  	var size int64
    40  	var layerMetadata map[string]string
    41  	layerID := img.RootFS.ChainID()
    42  	if layerID != "" {
    43  		l, err := daemon.stores[platform].layerStore.Get(layerID)
    44  		if err != nil {
    45  			return nil, err
    46  		}
    47  		defer layer.ReleaseAndLog(daemon.stores[platform].layerStore, l)
    48  		size, err = l.Size()
    49  		if err != nil {
    50  			return nil, err
    51  		}
    52  
    53  		layerMetadata, err = l.Metadata()
    54  		if err != nil {
    55  			return nil, err
    56  		}
    57  	}
    58  
    59  	comment := img.Comment
    60  	if len(comment) == 0 && len(img.History) > 0 {
    61  		comment = img.History[len(img.History)-1].Comment
    62  	}
    63  
    64  	lastUpdated, err := daemon.stores[platform].imageStore.GetLastUpdated(img.ID())
    65  	if err != nil {
    66  		return nil, err
    67  	}
    68  
    69  	imageInspect := &types.ImageInspect{
    70  		ID:              img.ID().String(),
    71  		RepoTags:        repoTags,
    72  		RepoDigests:     repoDigests,
    73  		Parent:          img.Parent.String(),
    74  		Comment:         comment,
    75  		Created:         img.Created.Format(time.RFC3339Nano),
    76  		Container:       img.Container,
    77  		ContainerConfig: &img.ContainerConfig,
    78  		DockerVersion:   img.DockerVersion,
    79  		Author:          img.Author,
    80  		Config:          img.Config,
    81  		Architecture:    img.Architecture,
    82  		Os:              platform,
    83  		OsVersion:       img.OSVersion,
    84  		Size:            size,
    85  		VirtualSize:     size, // TODO: field unused, deprecate
    86  		RootFS:          rootFSToAPIType(img.RootFS),
    87  		Metadata: types.ImageMetadata{
    88  			LastTagTime: lastUpdated,
    89  		},
    90  	}
    91  
    92  	imageInspect.GraphDriver.Name = daemon.GraphDriverName(platform)
    93  	imageInspect.GraphDriver.Data = layerMetadata
    94  
    95  	return imageInspect, nil
    96  }