github.com/jingleWang/moby@v1.13.1/daemon/image_inspect.go (about) 1 package daemon 2 3 import ( 4 "fmt" 5 "time" 6 7 "github.com/docker/docker/api/types" 8 "github.com/docker/docker/layer" 9 "github.com/docker/docker/reference" 10 ) 11 12 // LookupImage looks up an image by name and returns it as an ImageInspect 13 // structure. 14 func (daemon *Daemon) LookupImage(name string) (*types.ImageInspect, error) { 15 img, err := daemon.GetImage(name) 16 if err != nil { 17 return nil, fmt.Errorf("No such image: %s", name) 18 } 19 20 refs := daemon.referenceStore.References(img.ID().Digest()) 21 repoTags := []string{} 22 repoDigests := []string{} 23 for _, ref := range refs { 24 switch ref.(type) { 25 case reference.NamedTagged: 26 repoTags = append(repoTags, ref.String()) 27 case reference.Canonical: 28 repoDigests = append(repoDigests, ref.String()) 29 } 30 } 31 32 var size int64 33 var layerMetadata map[string]string 34 layerID := img.RootFS.ChainID() 35 if layerID != "" { 36 l, err := daemon.layerStore.Get(layerID) 37 if err != nil { 38 return nil, err 39 } 40 defer layer.ReleaseAndLog(daemon.layerStore, l) 41 size, err = l.Size() 42 if err != nil { 43 return nil, err 44 } 45 46 layerMetadata, err = l.Metadata() 47 if err != nil { 48 return nil, err 49 } 50 } 51 52 comment := img.Comment 53 if len(comment) == 0 && len(img.History) > 0 { 54 comment = img.History[len(img.History)-1].Comment 55 } 56 57 imageInspect := &types.ImageInspect{ 58 ID: img.ID().String(), 59 RepoTags: repoTags, 60 RepoDigests: repoDigests, 61 Parent: img.Parent.String(), 62 Comment: comment, 63 Created: img.Created.Format(time.RFC3339Nano), 64 Container: img.Container, 65 ContainerConfig: &img.ContainerConfig, 66 DockerVersion: img.DockerVersion, 67 Author: img.Author, 68 Config: img.Config, 69 Architecture: img.Architecture, 70 Os: img.OS, 71 OsVersion: img.OSVersion, 72 Size: size, 73 VirtualSize: size, // TODO: field unused, deprecate 74 RootFS: rootFSToAPIType(img.RootFS), 75 } 76 77 imageInspect.GraphDriver.Name = daemon.GraphDriverName() 78 79 imageInspect.GraphDriver.Data = layerMetadata 80 81 return imageInspect, nil 82 }