Merge pull request #1030 from stevvooe/calculate-correct-image-size
images: calculate size using ChildrenHandler
This commit is contained in:
commit
9ea7e47e78
@ -3,12 +3,12 @@ package images
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
|
||||||
"github.com/containerd/containerd/content"
|
"github.com/containerd/containerd/content"
|
||||||
digest "github.com/opencontainers/go-digest"
|
digest "github.com/opencontainers/go-digest"
|
||||||
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Image provides the model for how containerd views container images.
|
// Image provides the model for how containerd views container images.
|
||||||
@ -51,38 +51,13 @@ func (image *Image) RootFS(ctx context.Context, provider content.Provider) ([]di
|
|||||||
// Size returns the total size of an image's packed resources.
|
// Size returns the total size of an image's packed resources.
|
||||||
func (image *Image) Size(ctx context.Context, provider content.Provider) (int64, error) {
|
func (image *Image) Size(ctx context.Context, provider content.Provider) (int64, error) {
|
||||||
var size int64
|
var size int64
|
||||||
return size, Walk(ctx, HandlerFunc(func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
|
return size, Walk(ctx, Handlers(HandlerFunc(func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
|
||||||
switch image.Target.MediaType {
|
if desc.Size < 0 {
|
||||||
case MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest:
|
return nil, errors.Errorf("invalid size %v in %v (%v)", desc.Size, desc.Digest, desc.MediaType)
|
||||||
|
}
|
||||||
size += desc.Size
|
size += desc.Size
|
||||||
rc, err := provider.Reader(ctx, image.Target.Digest)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
defer rc.Close()
|
|
||||||
|
|
||||||
p, err := ioutil.ReadAll(rc)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var manifest ocispec.Manifest
|
|
||||||
if err := json.Unmarshal(p, &manifest); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
size += manifest.Config.Size
|
|
||||||
|
|
||||||
for _, layer := range manifest.Layers {
|
|
||||||
size += layer.Size
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, nil
|
return nil, nil
|
||||||
default:
|
}), ChildrenHandler(provider)), image.Target)
|
||||||
return nil, errors.New("unsupported type")
|
|
||||||
}
|
|
||||||
|
|
||||||
}), image.Target)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func Config(ctx context.Context, provider content.Provider, image ocispec.Descriptor) (ocispec.Descriptor, error) {
|
func Config(ctx context.Context, provider content.Provider, image ocispec.Descriptor) (ocispec.Descriptor, error) {
|
||||||
|
Loading…
Reference in New Issue
Block a user