7 "github.com/docker/distribution/reference"
8 "github.com/docker/docker/api/types"
9 "github.com/docker/docker/layer"
10 "github.com/pkg/errors"
13 // LookupImage looks up an image by name and returns it as an ImageInspect
15 func (daemon *Daemon) LookupImage(name string) (*types.ImageInspect, error) {
16 img, err := daemon.GetImage(name)
18 return nil, errors.Wrapf(err, "no such image: %s", name)
21 // If the image OS isn't set, assume it's the host OS
24 platform = runtime.GOOS
27 refs := daemon.stores[platform].referenceStore.References(img.ID().Digest())
28 repoTags := []string{}
29 repoDigests := []string{}
30 for _, ref := range refs {
32 case reference.NamedTagged:
33 repoTags = append(repoTags, reference.FamiliarString(ref))
34 case reference.Canonical:
35 repoDigests = append(repoDigests, reference.FamiliarString(ref))
40 var layerMetadata map[string]string
41 layerID := img.RootFS.ChainID()
43 l, err := daemon.stores[platform].layerStore.Get(layerID)
47 defer layer.ReleaseAndLog(daemon.stores[platform].layerStore, l)
53 layerMetadata, err = l.Metadata()
59 comment := img.Comment
60 if len(comment) == 0 && len(img.History) > 0 {
61 comment = img.History[len(img.History)-1].Comment
64 lastUpdated, err := daemon.stores[platform].imageStore.GetLastUpdated(img.ID())
69 imageInspect := &types.ImageInspect{
70 ID: img.ID().String(),
72 RepoDigests: repoDigests,
73 Parent: img.Parent.String(),
75 Created: img.Created.Format(time.RFC3339Nano),
76 Container: img.Container,
77 ContainerConfig: &img.ContainerConfig,
78 DockerVersion: img.DockerVersion,
81 Architecture: img.Architecture,
83 OsVersion: img.OSVersion,
85 VirtualSize: size, // TODO: field unused, deprecate
86 RootFS: rootFSToAPIType(img.RootFS),
87 Metadata: types.ImageMetadata{
88 LastTagTime: lastUpdated,
92 imageInspect.GraphDriver.Name = daemon.GraphDriverName(platform)
93 imageInspect.GraphDriver.Data = layerMetadata
95 return imageInspect, nil