Merge pull request #1030 from stevvooe/calculate-correct-image-size

images: calculate size using ChildrenHandler
This commit is contained in:
Michael Crosby 2017-06-20 10:26:40 -07:00 committed by GitHub
commit 9ea7e47e78

View File

@ -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) {