github.com/skf/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  }