Skip to content

Commit 8fb71ce

Browse files
ndeloofthaJeztah
authored andcommitted
manage image inspect data in backend
This allows differentiating how the detailed data is collected between the containerd-integration code and the existing implementation. Signed-off-by: Nicolas De Loof <[email protected]> Signed-off-by: Sebastiaan van Stijn <[email protected]>
1 parent a8eb15e commit 8fb71ce

4 files changed

Lines changed: 56 additions & 28 deletions

File tree

api/server/router/image/image_routes.go

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import (
1717
"github.com/docker/docker/api/types/versions"
1818
"github.com/docker/docker/errdefs"
1919
"github.com/docker/docker/image"
20-
"github.com/docker/docker/layer"
2120
"github.com/docker/docker/pkg/ioutils"
2221
"github.com/docker/docker/pkg/streamformatter"
2322
specs "github.com/opencontainers/image-spec/specs-go/v1"
@@ -193,7 +192,7 @@ func (ir *imageRouter) deleteImages(ctx context.Context, w http.ResponseWriter,
193192
}
194193

195194
func (ir *imageRouter) getImagesByName(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
196-
img, err := ir.backend.GetImage(ctx, vars["name"], opts.GetImageOpts{})
195+
img, err := ir.backend.GetImage(ctx, vars["name"], opts.GetImageOpts{Details: true})
197196
if err != nil {
198197
return err
199198
}
@@ -218,31 +217,11 @@ func (ir *imageRouter) toImageInspect(img *image.Image) (*types.ImageInspect, er
218217
}
219218
}
220219

221-
var size int64
222-
var layerMetadata map[string]string
223-
if layerID := img.RootFS.ChainID(); layerID != "" {
224-
l, err := ir.layerStore.Get(layerID)
225-
if err != nil {
226-
return nil, err
227-
}
228-
defer layer.ReleaseAndLog(ir.layerStore, l)
229-
size = l.Size()
230-
layerMetadata, err = l.Metadata()
231-
if err != nil {
232-
return nil, err
233-
}
234-
}
235-
236220
comment := img.Comment
237221
if len(comment) == 0 && len(img.History) > 0 {
238222
comment = img.History[len(img.History)-1].Comment
239223
}
240224

241-
lastUpdated, err := ir.imageStore.GetLastUpdated(img.ID())
242-
if err != nil {
243-
return nil, err
244-
}
245-
246225
return &types.ImageInspect{
247226
ID: img.ID().String(),
248227
RepoTags: repoTags,
@@ -259,15 +238,15 @@ func (ir *imageRouter) toImageInspect(img *image.Image) (*types.ImageInspect, er
259238
Variant: img.Variant,
260239
Os: img.OperatingSystem(),
261240
OsVersion: img.OSVersion,
262-
Size: size,
263-
VirtualSize: size, // TODO: field unused, deprecate
241+
Size: img.Details.Size,
242+
VirtualSize: img.Details.Size, // TODO: field unused, deprecate
264243
GraphDriver: types.GraphDriverData{
265-
Name: ir.layerStore.DriverName(),
266-
Data: layerMetadata,
244+
Name: img.Details.Driver,
245+
Data: img.Details.Metadata,
267246
},
268247
RootFS: rootFSToAPIType(img.RootFS),
269248
Metadata: types.ImageMetadata{
270-
LastTagTime: lastUpdated,
249+
LastTagTime: img.Details.LastUpdated,
271250
},
272251
}, nil
273252
}

api/types/image/opts.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ import specs "github.com/opencontainers/image-spec/specs-go/v1"
55
// GetImageOpts holds parameters to inspect an image.
66
type GetImageOpts struct {
77
Platform *specs.Platform
8+
Details bool
89
}

daemon/images/image.go

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
imagetypes "github.com/docker/docker/api/types/image"
1616
"github.com/docker/docker/errdefs"
1717
"github.com/docker/docker/image"
18+
"github.com/docker/docker/layer"
1819
"github.com/opencontainers/go-digest"
1920
specs "github.com/opencontainers/image-spec/specs-go/v1"
2021
"github.com/pkg/errors"
@@ -148,7 +149,43 @@ func (i *ImageService) manifestMatchesPlatform(ctx context.Context, img *image.I
148149
}
149150

150151
// GetImage returns an image corresponding to the image referred to by refOrID.
151-
func (i *ImageService) GetImage(ctx context.Context, refOrID string, options imagetypes.GetImageOpts) (retImg *image.Image, retErr error) {
152+
func (i *ImageService) GetImage(ctx context.Context, refOrID string, options imagetypes.GetImageOpts) (*image.Image, error) {
153+
img, err := i.getImage(ctx, refOrID, options)
154+
if err != nil {
155+
return nil, err
156+
}
157+
if options.Details {
158+
var size int64
159+
var layerMetadata map[string]string
160+
layerID := img.RootFS.ChainID()
161+
if layerID != "" {
162+
l, err := i.layerStore.Get(layerID)
163+
if err != nil {
164+
return nil, err
165+
}
166+
defer layer.ReleaseAndLog(i.layerStore, l)
167+
size = l.Size()
168+
layerMetadata, err = l.Metadata()
169+
if err != nil {
170+
return nil, err
171+
}
172+
}
173+
174+
lastUpdated, err := i.imageStore.GetLastUpdated(img.ID())
175+
if err != nil {
176+
return nil, err
177+
}
178+
img.Details = &image.Details{
179+
Size: size,
180+
Metadata: layerMetadata,
181+
Driver: i.layerStore.DriverName(),
182+
LastUpdated: lastUpdated,
183+
}
184+
}
185+
return img, nil
186+
}
187+
188+
func (i *ImageService) getImage(ctx context.Context, refOrID string, options imagetypes.GetImageOpts) (retImg *image.Image, retErr error) {
152189
defer func() {
153190
if retErr != nil || retImg == nil || options.Platform == nil {
154191
return

image/image.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,17 @@ type Image struct {
112112
// computedID is the ID computed from the hash of the image config.
113113
// Not to be confused with the legacy V1 ID in V1Image.
114114
computedID ID
115+
116+
// Details holds additional details about image
117+
Details *Details `json:"-"`
118+
}
119+
120+
// Details provides additional image data
121+
type Details struct {
122+
Size int64
123+
Metadata map[string]string
124+
Driver string
125+
LastUpdated time.Time
115126
}
116127

117128
// RawJSON returns the immutable JSON associated with the image.

0 commit comments

Comments
 (0)