github.com/zhouyu0/docker-note@v0.0.0-20190722021225-b8d3825084db/daemon/images/image_inspect.go (about) 1 package images // import "github.com/docker/docker/daemon/images" 2 3 import ( 4 "time" 5 6 "github.com/docker/distribution/reference" 7 "github.com/docker/docker/api/types" 8 "github.com/docker/docker/image" 9 "github.com/docker/docker/layer" 10 "github.com/docker/docker/pkg/system" 11 "github.com/pkg/errors" 12 ) 13 14 // LookupImage looks up an image by name and returns it as an ImageInspect 15 // structure. 16 func (i *ImageService) LookupImage(name string) (*types.ImageInspect, error) { 17 img, err := i.GetImage(name) 18 if err != nil { 19 return nil, errors.Wrapf(err, "no such image: %s", name) 20 } 21 if !system.IsOSSupported(img.OperatingSystem()) { 22 return nil, system.ErrNotSupportedOperatingSystem 23 } 24 refs := i.referenceStore.References(img.ID().Digest()) 25 repoTags := []string{} 26 repoDigests := []string{} 27 for _, ref := range refs { 28 switch ref.(type) { 29 case reference.NamedTagged: 30 repoTags = append(repoTags, reference.FamiliarString(ref)) 31 case reference.Canonical: 32 repoDigests = append(repoDigests, reference.FamiliarString(ref)) 33 } 34 } 35 36 var size int64 37 var layerMetadata map[string]string 38 layerID := img.RootFS.ChainID() 39 if layerID != "" { 40 l, err := i.layerStores[img.OperatingSystem()].Get(layerID) 41 if err != nil { 42 return nil, err 43 } 44 defer layer.ReleaseAndLog(i.layerStores[img.OperatingSystem()], l) 45 size, err = l.Size() 46 if err != nil { 47 return nil, err 48 } 49 50 layerMetadata, err = l.Metadata() 51 if err != nil { 52 return nil, err 53 } 54 } 55 56 comment := img.Comment 57 if len(comment) == 0 && len(img.History) > 0 { 58 comment = img.History[len(img.History)-1].Comment 59 } 60 61 lastUpdated, err := i.imageStore.GetLastUpdated(img.ID()) 62 if err != nil { 63 return nil, err 64 } 65 66 imageInspect := &types.ImageInspect{ 67 ID: img.ID().String(), 68 RepoTags: repoTags, 69 RepoDigests: repoDigests, 70 Parent: img.Parent.String(), 71 Comment: comment, 72 Created: img.Created.Format(time.RFC3339Nano), 73 Container: img.Container, 74 ContainerConfig: &img.ContainerConfig, 75 DockerVersion: img.DockerVersion, 76 Author: img.Author, 77 Config: img.Config, 78 Architecture: img.Architecture, 79 Os: img.OperatingSystem(), 80 OsVersion: img.OSVersion, 81 Size: size, 82 VirtualSize: size, // TODO: field unused, deprecate 83 RootFS: rootFSToAPIType(img.RootFS), 84 Metadata: types.ImageMetadata{ 85 LastTagTime: lastUpdated, 86 }, 87 } 88 89 imageInspect.GraphDriver.Name = i.layerStores[img.OperatingSystem()].DriverName() 90 imageInspect.GraphDriver.Data = layerMetadata 91 92 return imageInspect, nil 93 } 94 95 func rootFSToAPIType(rootfs *image.RootFS) types.RootFS { 96 var layers []string 97 for _, l := range rootfs.DiffIDs { 98 layers = append(layers, l.String()) 99 } 100 return types.RootFS{ 101 Type: rootfs.Type, 102 Layers: layers, 103 } 104 }