github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/engine/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, nil) 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 Variant: img.Variant, 80 Os: img.OperatingSystem(), 81 OsVersion: img.OSVersion, 82 Size: size, 83 VirtualSize: size, // TODO: field unused, deprecate 84 RootFS: rootFSToAPIType(img.RootFS), 85 Metadata: types.ImageMetadata{ 86 LastTagTime: lastUpdated, 87 }, 88 } 89 90 imageInspect.GraphDriver.Name = i.layerStores[img.OperatingSystem()].DriverName() 91 imageInspect.GraphDriver.Data = layerMetadata 92 93 return imageInspect, nil 94 } 95 96 func rootFSToAPIType(rootfs *image.RootFS) types.RootFS { 97 var layers []string 98 for _, l := range rootfs.DiffIDs { 99 layers = append(layers, l.String()) 100 } 101 return types.RootFS{ 102 Type: rootfs.Type, 103 Layers: layers, 104 } 105 }