daemon/image_inspect.go
d5baf8dd
 package daemon
 
 import (
 	"time"
 
3a127939
 	"github.com/docker/distribution/reference"
91e197d6
 	"github.com/docker/docker/api/types"
d5baf8dd
 	"github.com/docker/docker/layer"
0cba7740
 	"github.com/docker/docker/pkg/system"
cc9ed0a3
 	"github.com/pkg/errors"
d5baf8dd
 )
 
 // LookupImage looks up an image by name and returns it as an ImageInspect
 // structure.
 func (daemon *Daemon) LookupImage(name string) (*types.ImageInspect, error) {
 	img, err := daemon.GetImage(name)
 	if err != nil {
cc9ed0a3
 		return nil, errors.Wrapf(err, "no such image: %s", name)
d5baf8dd
 	}
0cba7740
 	if !system.IsOSSupported(img.OperatingSystem()) {
 		return nil, system.ErrNotSupportedOperatingSystem
 	}
7b9a8f46
 	refs := daemon.referenceStore.References(img.ID().Digest())
d5baf8dd
 	repoTags := []string{}
 	repoDigests := []string{}
 	for _, ref := range refs {
 		switch ref.(type) {
 		case reference.NamedTagged:
3a127939
 			repoTags = append(repoTags, reference.FamiliarString(ref))
d5baf8dd
 		case reference.Canonical:
3a127939
 			repoDigests = append(repoDigests, reference.FamiliarString(ref))
d5baf8dd
 		}
 	}
 
 	var size int64
 	var layerMetadata map[string]string
 	layerID := img.RootFS.ChainID()
 	if layerID != "" {
afd305c4
 		l, err := daemon.layerStores[img.OperatingSystem()].Get(layerID)
d5baf8dd
 		if err != nil {
 			return nil, err
 		}
afd305c4
 		defer layer.ReleaseAndLog(daemon.layerStores[img.OperatingSystem()], l)
d5baf8dd
 		size, err = l.Size()
 		if err != nil {
 			return nil, err
 		}
 
 		layerMetadata, err = l.Metadata()
 		if err != nil {
 			return nil, err
 		}
 	}
 
 	comment := img.Comment
 	if len(comment) == 0 && len(img.History) > 0 {
 		comment = img.History[len(img.History)-1].Comment
 	}
 
ce8e529e
 	lastUpdated, err := daemon.imageStore.GetLastUpdated(img.ID())
016eea00
 	if err != nil {
 		return nil, err
 	}
 
d5baf8dd
 	imageInspect := &types.ImageInspect{
 		ID:              img.ID().String(),
 		RepoTags:        repoTags,
 		RepoDigests:     repoDigests,
 		Parent:          img.Parent.String(),
 		Comment:         comment,
 		Created:         img.Created.Format(time.RFC3339Nano),
 		Container:       img.Container,
 		ContainerConfig: &img.ContainerConfig,
 		DockerVersion:   img.DockerVersion,
 		Author:          img.Author,
 		Config:          img.Config,
 		Architecture:    img.Architecture,
afd305c4
 		Os:              img.OperatingSystem(),
b7f537e8
 		OsVersion:       img.OSVersion,
d5baf8dd
 		Size:            size,
 		VirtualSize:     size, // TODO: field unused, deprecate
 		RootFS:          rootFSToAPIType(img.RootFS),
016eea00
 		Metadata: types.ImageMetadata{
 			LastTagTime: lastUpdated,
 		},
d5baf8dd
 	}
 
afd305c4
 	imageInspect.GraphDriver.Name = daemon.GraphDriverName(img.OperatingSystem())
d5baf8dd
 	imageInspect.GraphDriver.Data = layerMetadata
 
 	return imageInspect, nil
 }