Skip to content

Commit

Permalink
Fix image size calculation in importer
Browse files Browse the repository at this point in the history
After upgrading docker/distibution V1Compatibility no longer contains Size. For
this reason, the image size calculation is wrong. A new way to calculate the
size repeats the way that dockerregistry calculates the size.
  • Loading branch information
legionus committed Jun 1, 2016
1 parent 7afe72b commit 4bcc443
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 0 deletions.
2 changes: 2 additions & 0 deletions pkg/image/api/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,8 @@ func ImageWithMetadata(image *Image) error {
image.DockerImageLayers[i].Name = layer.DockerBlobSum
}
if len(manifest.History) == len(image.DockerImageLayers) {
// This code does not work since hub.docker.com has been updated.
// The V1Compatibility no longer contains Size.
image.DockerImageLayers[0].Size = v1Metadata.Size
var size = DockerV1CompatibilityImageSize{}
for i, obj := range manifest.History[1:] {
Expand Down
33 changes: 33 additions & 0 deletions pkg/image/importer/importer.go
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,27 @@ func applyErrorToRepository(repository *importRepository, err error) {
}
}

func calculateImageSize(ctx gocontext.Context, repo distribution.Repository, image *api.Image) error {
bs := repo.Blobs(ctx)

layerSet := sets.NewString()
size := int64(0)
for i := range image.DockerImageLayers {
layer := &image.DockerImageLayers[i]
desc, err := bs.Stat(ctx, digest.Digest(layer.Name))
if err != nil {
return err
}
layer.Size = desc.Size
if !layerSet.Has(layer.Name) {
size += desc.Size
layerSet.Insert(layer.Name)
}
}
image.DockerImageMetadata.Size = size
return nil
}

// importRepositoryFromDocker loads the tags and images requested in the passed importRepository, obeying the
// optional rate limiter. Errors are set onto the individual tags and digest objects.
func importRepositoryFromDocker(ctx gocontext.Context, retriever RepositoryRetriever, repository *importRepository, limiter flowcontrol.RateLimiter) {
Expand Down Expand Up @@ -397,6 +418,12 @@ func importRepositoryFromDocker(ctx gocontext.Context, retriever RepositoryRetri
importDigest.Err = err
continue
}
if importDigest.Image.DockerImageMetadata.Size == 0 {
if err := calculateImageSize(ctx, repo, importDigest.Image); err != nil {
importDigest.Err = err
continue
}
}
}

for i := range repository.Tags {
Expand Down Expand Up @@ -430,6 +457,12 @@ func importRepositoryFromDocker(ctx gocontext.Context, retriever RepositoryRetri
importTag.Err = err
continue
}
if importTag.Image.DockerImageMetadata.Size == 0 {
if err := calculateImageSize(ctx, repo, importTag.Image); err != nil {
importTag.Err = err
continue
}
}
}
}

Expand Down

0 comments on commit 4bcc443

Please sign in to comment.