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 }