Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions api/server/router/image/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ type Backend interface {

type imageBackend interface {
ImageDelete(ctx context.Context, imageRef string, force, prune bool) ([]types.ImageDeleteResponseItem, error)
ImageHistory(imageName string) ([]*image.HistoryResponseItem, error)
ImageHistory(ctx context.Context, imageName string) ([]*image.HistoryResponseItem, error)
Comment thread
ndeloof marked this conversation as resolved.
Images(ctx context.Context, opts types.ImageListOptions) ([]*types.ImageSummary, error)
GetImage(ctx context.Context, refOrID string, platform *specs.Platform) (*dockerimage.Image, error)
GetImage(ctx context.Context, refOrID string, options image.GetImageOpts) (*dockerimage.Image, error)
TagImage(ctx context.Context, imageName, repository, tag string) (string, error)
ImagesPrune(ctx context.Context, pruneFilters filters.Args) (*types.ImagesPruneReport, error)
}
Expand Down
37 changes: 8 additions & 29 deletions api/server/router/image/image_routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ import (
"github.com/docker/docker/api/server/httputils"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/filters"
opts "github.com/docker/docker/api/types/image"
"github.com/docker/docker/api/types/versions"
"github.com/docker/docker/errdefs"
"github.com/docker/docker/image"
"github.com/docker/docker/layer"
"github.com/docker/docker/pkg/ioutils"
"github.com/docker/docker/pkg/streamformatter"
specs "github.com/opencontainers/image-spec/specs-go/v1"
Expand Down Expand Up @@ -204,7 +204,7 @@ func (s *imageRouter) deleteImages(ctx context.Context, w http.ResponseWriter, r
}

func (s *imageRouter) getImagesByName(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
image, err := s.backend.GetImage(ctx, vars["name"], nil)
image, err := s.backend.GetImage(ctx, vars["name"], opts.GetImageOpts{Details: true})
if err != nil {
return err
}
Expand All @@ -230,32 +230,11 @@ func (s *imageRouter) toImageInspect(img *image.Image) (*types.ImageInspect, err
}
}

var size int64
var layerMetadata map[string]string
layerID := img.RootFS.ChainID()
if layerID != "" {
l, err := s.layerStore.Get(layerID)
if err != nil {
return nil, err
}
defer layer.ReleaseAndLog(s.layerStore, l)
size = l.Size()
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
}

lastUpdated, err := s.imageStore.GetLastUpdated(img.ID())
if err != nil {
return nil, err
}

return &types.ImageInspect{
ID: img.ID().String(),
RepoTags: repoTags,
Expand All @@ -272,15 +251,15 @@ func (s *imageRouter) toImageInspect(img *image.Image) (*types.ImageInspect, err
Variant: img.Variant,
Os: img.OperatingSystem(),
OsVersion: img.OSVersion,
Size: size,
VirtualSize: size, // TODO: field unused, deprecate
Size: img.Details.Size,
VirtualSize: img.Details.Size, // TODO: field unused, deprecate
GraphDriver: types.GraphDriverData{
Name: s.layerStore.DriverName(),
Data: layerMetadata,
Name: img.Details.Driver,
Data: img.Details.Metadata,
},
RootFS: rootFSToAPIType(img.RootFS),
Metadata: types.ImageMetadata{
LastTagTime: lastUpdated,
LastTagTime: img.Details.LastUpdated,
},
}, nil
}
Expand Down Expand Up @@ -335,7 +314,7 @@ func (s *imageRouter) getImagesJSON(ctx context.Context, w http.ResponseWriter,

func (s *imageRouter) getImagesHistory(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
name := vars["name"]
history, err := s.backend.ImageHistory(name)
history, err := s.backend.ImageHistory(ctx, name)
if err != nil {
return err
}
Expand Down
9 changes: 9 additions & 0 deletions api/types/image/opts.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package image

import specs "github.com/opencontainers/image-spec/specs-go/v1"

// GetImageOpts holds parameters to inspect an image.
type GetImageOpts struct {
Platform *specs.Platform
Details bool
}
3 changes: 2 additions & 1 deletion daemon/cluster/executor/backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/api/types/filters"
opts "github.com/docker/docker/api/types/image"
"github.com/docker/docker/api/types/network"
swarmtypes "github.com/docker/docker/api/types/swarm"
"github.com/docker/docker/api/types/volume"
Expand Down Expand Up @@ -75,5 +76,5 @@ type VolumeBackend interface {
type ImageBackend interface {
PullImage(ctx context.Context, image, tag string, platform *specs.Platform, metaHeaders map[string][]string, authConfig *types.AuthConfig, outStream io.Writer) error
GetRepository(context.Context, reference.Named, *types.AuthConfig) (distribution.Repository, error)
GetImage(ctx context.Context, refOrID string, platform *specs.Platform) (retImg *image.Image, retErr error)
GetImage(ctx context.Context, refOrID string, options opts.GetImageOpts) (retImg *image.Image, retErr error)
}
3 changes: 2 additions & 1 deletion daemon/cluster/executor/container/adapter.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"github.com/docker/docker/api/types/backend"
containertypes "github.com/docker/docker/api/types/container"
"github.com/docker/docker/api/types/events"
imagetypes "github.com/docker/docker/api/types/image"
containerpkg "github.com/docker/docker/container"
"github.com/docker/docker/daemon"
"github.com/docker/docker/daemon/cluster/convert"
Expand Down Expand Up @@ -74,7 +75,7 @@ func (c *containerAdapter) pullImage(ctx context.Context) error {
named, err := reference.ParseNormalizedNamed(spec.Image)
if err == nil {
if _, ok := named.(reference.Canonical); ok {
_, err := c.imageBackend.GetImage(ctx, spec.Image, nil)
_, err := c.imageBackend.GetImage(ctx, spec.Image, imagetypes.GetImageOpts{})
if err == nil {
return nil
}
Expand Down
46 changes: 38 additions & 8 deletions daemon/containerd/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -411,7 +411,7 @@ func (cs *containerdStore) ImageDelete(ctx context.Context, imageRef string, for
return records, nil
}

func (cs *containerdStore) ImageHistory(name string) ([]*imagetype.HistoryResponseItem, error) {
func (cs *containerdStore) ImageHistory(ctx context.Context, name string) ([]*imagetype.HistoryResponseItem, error) {
panic("not implemented")
}

Expand Down Expand Up @@ -573,34 +573,63 @@ func (cs *containerdStore) GetContainerdImage(ctx context.Context, refOrID strin
return cs.resolveImageName2(ctx, refOrID)
}

func (cs *containerdStore) GetImage(ctx context.Context, refOrID string, platform *v1.Platform) (*image.Image, error) {
desc, err := cs.ResolveImage(ctx, refOrID)
func (cs *containerdStore) GetImage(ctx context.Context, refOrID string, options imagetype.GetImageOpts) (*image.Image, error) {
ii, img, err := cs.getImage(ctx, refOrID, options.Platform)
if err != nil {
return nil, err
}

if options.Details {
size, err := ii.Size(ctx)
if err != nil {
return nil, err
}
img.Details = &image.Details{
Size: size,
Metadata: nil,
Driver: cs.GraphDriverName(),
LastUpdated: ii.Metadata().UpdatedAt,
}
}
return img, err
}

func (cs *containerdStore) getImage(ctx context.Context, refOrID string, platform *v1.Platform) (containerd.Image, *image.Image, error) {
desc, err := cs.ResolveImage(ctx, refOrID)
if err != nil {
return nil, nil, err
}

ctrdimg, err := cs.resolveImageName2(ctx, refOrID)
if err != nil {
return nil, err
return nil, nil, err
}
ii := containerd.NewImage(cs.client, ctrdimg)
provider := cs.client.ContentStore()
conf, err := ctrdimg.Config(ctx, provider, ii.Platform())
if err != nil {
return nil, err
return nil, nil, err
}

var ociimage v1.Image
imageConfigBytes, err := content.ReadBlob(ctx, ii.ContentStore(), conf)
if err != nil {
return nil, err
return nil, nil, err
}

if err := json.Unmarshal(imageConfigBytes, &ociimage); err != nil {
return nil, err
return nil, nil, err
}

return &image.Image{
fs, err := ii.RootFS(ctx)
if err != nil {
return nil, nil, err
}
rootfs := image.NewRootFS()
for _, id := range fs {
rootfs.Append(layer.DiffID(id))
}
return ii, &image.Image{
V1Image: image.V1Image{
ID: string(desc.Digest),
OS: ociimage.OS,
Expand All @@ -613,6 +642,7 @@ func (cs *containerdStore) GetImage(ctx context.Context, refOrID string, platfor
WorkingDir: ociimage.Config.WorkingDir,
},
},
RootFS: rootfs,
}, nil
}

Expand Down
5 changes: 3 additions & 2 deletions daemon/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/containerd/containerd/platforms"
"github.com/docker/docker/api/types"
containertypes "github.com/docker/docker/api/types/container"
imagetypes "github.com/docker/docker/api/types/image"
networktypes "github.com/docker/docker/api/types/network"
"github.com/docker/docker/container"
"github.com/docker/docker/daemon/images"
Expand Down Expand Up @@ -76,7 +77,7 @@ func (daemon *Daemon) containerCreate(ctx context.Context, opts createOpts) (con
}

if opts.params.Platform == nil && opts.params.Config.Image != "" {
if img, _ := daemon.imageService.GetImage(ctx, opts.params.Config.Image, opts.params.Platform); img != nil {
if img, _ := daemon.imageService.GetImage(ctx, opts.params.Config.Image, imagetypes.GetImageOpts{Platform: opts.params.Platform}); img != nil {
p := maximumSpec()
imgPlat := v1.Platform{
OS: img.OS,
Expand Down Expand Up @@ -127,7 +128,7 @@ func (daemon *Daemon) create(ctx context.Context, opts createOpts) (retC *contai
)

if opts.params.Config.Image != "" {
img, err = daemon.imageService.GetImage(ctx, opts.params.Config.Image, opts.params.Platform)
img, err = daemon.imageService.GetImage(ctx, opts.params.Config.Image, imagetypes.GetImageOpts{Platform: opts.params.Platform})
if err != nil {
return nil, err
}
Expand Down
4 changes: 2 additions & 2 deletions daemon/image_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ type ImageService interface {
ImportImage(ctx context.Context, src string, repository string, platform *v1.Platform, tag string, msg string, inConfig io.ReadCloser, outStream io.Writer, changes []string) error
TagImage(ctx context.Context, imageName, repository, tag string) (string, error)
TagImageWithReference(ctx context.Context, imageID image.ID, newTag reference.Named) error
GetImage(ctx context.Context, refOrID string, platform *v1.Platform) (*image.Image, error)
ImageHistory(name string) ([]*imagetype.HistoryResponseItem, error)
GetImage(ctx context.Context, refOrID string, options imagetype.GetImageOpts) (*image.Image, error)
ImageHistory(ctx context.Context, name string) ([]*imagetype.HistoryResponseItem, error)
CommitImage(c backend.CommitConfig) (image.ID, error)
SquashImage(id, parent string) (string, error)

Expand Down
3 changes: 2 additions & 1 deletion daemon/images/cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package images // import "github.com/docker/docker/daemon/images"
import (
"context"

imagetypes "github.com/docker/docker/api/types/image"
"github.com/docker/docker/builder"
"github.com/docker/docker/image/cache"
"github.com/sirupsen/logrus"
Expand All @@ -17,7 +18,7 @@ func (i *ImageService) MakeImageCache(ctx context.Context, sourceRefs []string)
cache := cache.New(i.imageStore)

for _, ref := range sourceRefs {
img, err := i.GetImage(ctx, ref, nil)
img, err := i.GetImage(ctx, ref, imagetypes.GetImageOpts{})
if err != nil {
logrus.Warnf("Could not look up %s for cache resolution, skipping: %+v", ref, err)
continue
Expand Down
40 changes: 39 additions & 1 deletion daemon/images/image.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@ import (
"github.com/containerd/containerd/leases"
"github.com/containerd/containerd/platforms"
"github.com/docker/distribution/reference"
imagetypes "github.com/docker/docker/api/types/image"
"github.com/docker/docker/errdefs"
"github.com/docker/docker/image"
"github.com/docker/docker/layer"
"github.com/opencontainers/go-digest"
specs "github.com/opencontainers/image-spec/specs-go/v1"
"github.com/pkg/errors"
Expand Down Expand Up @@ -148,7 +150,43 @@ func (i *ImageService) manifestMatchesPlatform(img *image.Image, platform specs.
}

// GetImage returns an image corresponding to the image referred to by refOrID.
func (i *ImageService) GetImage(ctx context.Context, refOrID string, platform *specs.Platform) (retImg *image.Image, retErr error) {
func (i *ImageService) GetImage(ctx context.Context, refOrID string, options imagetypes.GetImageOpts) (*image.Image, error) {
img, err := i.getImage(refOrID, options.Platform)
if err != nil {
return nil, err
}
if options.Details {
var size int64
var layerMetadata map[string]string
layerID := img.RootFS.ChainID()
if layerID != "" {
l, err := i.layerStore.Get(layerID)
if err != nil {
return nil, err
}
defer layer.ReleaseAndLog(i.layerStore, l)
size = l.Size()
layerMetadata, err = l.Metadata()
if err != nil {
return nil, err
}
}

lastUpdated, err := i.imageStore.GetLastUpdated(img.ID())
if err != nil {
return nil, err
}
img.Details = &image.Details{
Size: size,
Metadata: layerMetadata,
Driver: i.layerStore.DriverName(),
LastUpdated: lastUpdated,
}
}
return img, nil
}

func (i *ImageService) getImage(refOrID string, platform *specs.Platform) (retImg *image.Image, retErr error) {
defer func() {
if retErr != nil || retImg == nil || platform == nil {
return
Expand Down
5 changes: 3 additions & 2 deletions daemon/images/image_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"github.com/docker/distribution/reference"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/backend"
imagetypes "github.com/docker/docker/api/types/image"
"github.com/docker/docker/builder"
"github.com/docker/docker/errdefs"
"github.com/docker/docker/image"
Expand Down Expand Up @@ -167,7 +168,7 @@ func (i *ImageService) pullForBuilder(ctx context.Context, name string, authConf
return nil, err
}

img, err := i.GetImage(nil, name, platform)
img, err := i.GetImage(nil, name, imagetypes.GetImageOpts{Platform: platform})
if errdefs.IsNotFound(err) && img != nil && platform != nil {
imgPlat := specs.Platform{
OS: img.OS,
Expand Down Expand Up @@ -211,7 +212,7 @@ func (i *ImageService) GetImageAndReleasableLayer(ctx context.Context, refOrID s
}

if opts.PullOption != backend.PullOptionForcePull {
image, err := i.GetImage(nil, refOrID, opts.Platform)
image, err := i.GetImage(nil, refOrID, imagetypes.GetImageOpts{Platform: opts.Platform})
if err != nil && opts.PullOption == backend.PullOptionNoPull {
return nil, nil, err
}
Expand Down
3 changes: 2 additions & 1 deletion daemon/images/image_delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (

"github.com/docker/distribution/reference"
"github.com/docker/docker/api/types"
imagetypes "github.com/docker/docker/api/types/image"
"github.com/docker/docker/container"
"github.com/docker/docker/errdefs"
"github.com/docker/docker/image"
Expand Down Expand Up @@ -63,7 +64,7 @@ func (i *ImageService) ImageDelete(ctx context.Context, imageRef string, force,
start := time.Now()
records := []types.ImageDeleteResponseItem{}

img, err := i.GetImage(ctx, imageRef, nil)
img, err := i.GetImage(ctx, imageRef, imagetypes.GetImageOpts{})
if err != nil {
return nil, err
}
Expand Down
3 changes: 2 additions & 1 deletion daemon/images/image_events.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package images // import "github.com/docker/docker/daemon/images"

import (
"github.com/docker/docker/api/types/events"
imagetypes "github.com/docker/docker/api/types/image"
)

// LogImageEvent generates an event related to an image with only the default attributes.
Expand All @@ -11,7 +12,7 @@ func (i *ImageService) LogImageEvent(imageID, refName, action string) {

// LogImageEventWithAttributes generates an event related to an image with specific given attributes.
func (i *ImageService) LogImageEventWithAttributes(imageID, refName, action string, attributes map[string]string) {
img, err := i.GetImage(nil, imageID, nil)
img, err := i.GetImage(nil, imageID, imagetypes.GetImageOpts{})
if err == nil && img.Config != nil {
// image has not been removed yet.
// it could be missing if the event is `delete`.
Expand Down
Loading