github.com/sams1990/dockerrepo@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 }