diff --git a/pkg/v1/tarball/image.go b/pkg/v1/tarball/image.go index c984f3c8f..aba609dea 100644 --- a/pkg/v1/tarball/image.go +++ b/pkg/v1/tarball/image.go @@ -299,18 +299,29 @@ func (i *uncompressedImage) LayerByDiffID(h v1.Hash) (partial.UncompressedLayer, // v1.Layer doesn't force consumers to care about whether the layer is compressed // we should be fine returning the DockerLayer media type mt := types.DockerLayer - if bd, ok := i.imgDescriptor.LayerSources[h]; ok { - // Overwrite the mediaType for foreign layers. - return &foreignUncompressedLayer{ - uncompressedLayerFromTarball: uncompressedLayerFromTarball{ - diffID: diffID, - mediaType: bd.MediaType, - opener: i.opener, - filePath: i.imgDescriptor.Layers[idx], - }, - desc: bd, - }, nil + bd, ok := i.imgDescriptor.LayerSources[h] + if ok { + // This is janky, but we don't want to implement Descriptor for + // uncompressed layers because it breaks a bunch of assumptions in partial. + // See https://github.com/google/go-containerregistry/issues/1870 + docker25workaround := bd.MediaType == types.DockerUncompressedLayer || bd.MediaType == types.OCIUncompressedLayer + + if !docker25workaround { + // Overwrite the mediaType for foreign layers. + return &foreignUncompressedLayer{ + uncompressedLayerFromTarball: uncompressedLayerFromTarball{ + diffID: diffID, + mediaType: bd.MediaType, + opener: i.opener, + filePath: i.imgDescriptor.Layers[idx], + }, + desc: bd, + }, nil + } + + // Intentional fall through. } + return &uncompressedLayerFromTarball{ diffID: diffID, mediaType: mt, diff --git a/pkg/v1/tarball/image_test.go b/pkg/v1/tarball/image_test.go index 3a46400e4..7b1653914 100644 --- a/pkg/v1/tarball/image_test.go +++ b/pkg/v1/tarball/image_test.go @@ -70,6 +70,16 @@ func TestBundleSingle(t *testing.T) { } } +func TestDocker25(t *testing.T) { + img, err := ImageFromPath("testdata/hello-world-v25.tar", nil) + if err != nil { + t.Fatal(err) + } + if err := validate.Image(img); err != nil { + t.Fatal(err) + } +} + func TestBundleMultiple(t *testing.T) { for _, imgName := range []string{ "test_image_1", diff --git a/pkg/v1/tarball/testdata/hello-world-v25.tar b/pkg/v1/tarball/testdata/hello-world-v25.tar new file mode 100644 index 000000000..4fd68388e Binary files /dev/null and b/pkg/v1/tarball/testdata/hello-world-v25.tar differ