Remove forked reference package. Use normalized named values everywhere and familiar functions to convert back to familiar strings for UX and storage compatibility. Enforce that the source repository in the distribution metadata is always a normalized string, ignore invalid values which are not. Update distribution tests to use normalized values. Signed-off-by: Derek McGowan <derek@mcgstyle.net> (github: dmcgowan) Upstream-commit: 3a1279393faf78632bf169619d407e584da84b66 Component: engine
83 lines
2.1 KiB
Go
83 lines
2.1 KiB
Go
package daemon
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/docker/distribution/reference"
|
|
"github.com/docker/docker/api/types"
|
|
"github.com/docker/docker/layer"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// LookupImage looks up an image by name and returns it as an ImageInspect
|
|
// structure.
|
|
func (daemon *Daemon) LookupImage(name string) (*types.ImageInspect, error) {
|
|
img, err := daemon.GetImage(name)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "no such image: %s", name)
|
|
}
|
|
|
|
refs := daemon.referenceStore.References(img.ID().Digest())
|
|
repoTags := []string{}
|
|
repoDigests := []string{}
|
|
for _, ref := range refs {
|
|
switch ref.(type) {
|
|
case reference.NamedTagged:
|
|
repoTags = append(repoTags, reference.FamiliarString(ref))
|
|
case reference.Canonical:
|
|
repoDigests = append(repoDigests, reference.FamiliarString(ref))
|
|
}
|
|
}
|
|
|
|
var size int64
|
|
var layerMetadata map[string]string
|
|
layerID := img.RootFS.ChainID()
|
|
if layerID != "" {
|
|
l, err := daemon.layerStore.Get(layerID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer layer.ReleaseAndLog(daemon.layerStore, l)
|
|
size, err = l.Size()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
layerMetadata, err = l.Metadata()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
comment := img.Comment
|
|
if len(comment) == 0 && len(img.History) > 0 {
|
|
comment = img.History[len(img.History)-1].Comment
|
|
}
|
|
|
|
imageInspect := &types.ImageInspect{
|
|
ID: img.ID().String(),
|
|
RepoTags: repoTags,
|
|
RepoDigests: repoDigests,
|
|
Parent: img.Parent.String(),
|
|
Comment: comment,
|
|
Created: img.Created.Format(time.RFC3339Nano),
|
|
Container: img.Container,
|
|
ContainerConfig: &img.ContainerConfig,
|
|
DockerVersion: img.DockerVersion,
|
|
Author: img.Author,
|
|
Config: img.Config,
|
|
Architecture: img.Architecture,
|
|
Os: img.OS,
|
|
OsVersion: img.OSVersion,
|
|
Size: size,
|
|
VirtualSize: size, // TODO: field unused, deprecate
|
|
RootFS: rootFSToAPIType(img.RootFS),
|
|
}
|
|
|
|
imageInspect.GraphDriver.Name = daemon.GraphDriverName()
|
|
|
|
imageInspect.GraphDriver.Data = layerMetadata
|
|
|
|
return imageInspect, nil
|
|
}
|