bugfix: cache empty layer for docker schema1 image
containerd should cache empty label for docker schema1 image. if not, the original empty layer will be non-empty layer and the image config will be changed too. in this case, the image ID will be changed. check the blob empty label to avoid changing image ID when repull docker schema1 image. Signed-off-by: Wei Fu <fuweid89@gmail.com>
This commit is contained in:
parent
87d1118a0f
commit
57d79e1b49
@ -24,6 +24,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
@ -42,7 +43,10 @@ import (
|
|||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
const manifestSizeLimit = 8e6 // 8MB
|
const (
|
||||||
|
manifestSizeLimit = 8e6 // 8MB
|
||||||
|
labelDockerSchema1EmptyLayer = "containerd.io/docker.schema1.empty.layer"
|
||||||
|
)
|
||||||
|
|
||||||
type blobState struct {
|
type blobState struct {
|
||||||
diffID digest.Digest
|
diffID digest.Digest
|
||||||
@ -353,10 +357,11 @@ func (c *Converter) fetchBlob(ctx context.Context, desc ocispec.Descriptor) erro
|
|||||||
Digest: desc.Digest,
|
Digest: desc.Digest,
|
||||||
Labels: map[string]string{
|
Labels: map[string]string{
|
||||||
"containerd.io/uncompressed": state.diffID.String(),
|
"containerd.io/uncompressed": state.diffID.String(),
|
||||||
|
labelDockerSchema1EmptyLayer: strconv.FormatBool(state.empty),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := c.contentStore.Update(ctx, cinfo, "labels.containerd.io/uncompressed"); err != nil {
|
if _, err := c.contentStore.Update(ctx, cinfo, "labels.containerd.io/uncompressed", fmt.Sprintf("labels.%s", labelDockerSchema1EmptyLayer)); err != nil {
|
||||||
return errors.Wrap(err, "failed to update uncompressed label")
|
return errors.Wrap(err, "failed to update uncompressed label")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -380,7 +385,18 @@ func (c *Converter) reuseLabelBlobState(ctx context.Context, desc ocispec.Descri
|
|||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
bState := blobState{empty: false}
|
emptyVal, ok := cinfo.Labels[labelDockerSchema1EmptyLayer]
|
||||||
|
if !ok {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
isEmpty, err := strconv.ParseBool(emptyVal)
|
||||||
|
if err != nil {
|
||||||
|
log.G(ctx).WithField("id", desc.Digest).Warnf("failed to parse bool from label %s: %v", labelDockerSchema1EmptyLayer, isEmpty)
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
bState := blobState{empty: isEmpty}
|
||||||
|
|
||||||
if bState.diffID, err = digest.Parse(diffID); err != nil {
|
if bState.diffID, err = digest.Parse(diffID); err != nil {
|
||||||
log.G(ctx).WithField("id", desc.Digest).Warnf("failed to parse digest from label containerd.io/uncompressed: %v", diffID)
|
log.G(ctx).WithField("id", desc.Digest).Warnf("failed to parse digest from label containerd.io/uncompressed: %v", diffID)
|
||||||
|
Loading…
Reference in New Issue
Block a user