Skip to content

Commit 92222dc

Browse files
authored
Merge pull request #293 from LucaGuerra/docker-v2s2-zstd
Do not error on Docker V2 images with Zstd compression
2 parents 9e504ae + 7c18467 commit 92222dc

File tree

6 files changed

+14
-6
lines changed

6 files changed

+14
-6
lines changed

image/copy/compression.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,10 @@ var (
2727
// expectedBaseCompressionFormats is used to check if a blob with a specified media type is compressed
2828
// using the algorithm that the media type says it should be compressed with
2929
expectedBaseCompressionFormats = map[string]*compressiontypes.Algorithm{
30-
imgspecv1.MediaTypeImageLayerGzip: &compression.Gzip,
31-
imgspecv1.MediaTypeImageLayerZstd: &compression.Zstd,
32-
manifest.DockerV2Schema2LayerMediaType: &compression.Gzip,
30+
imgspecv1.MediaTypeImageLayerGzip: &compression.Gzip,
31+
imgspecv1.MediaTypeImageLayerZstd: &compression.Zstd,
32+
manifest.DockerV2Schema2LayerMediaType: &compression.Gzip,
33+
manifest.DockerV2SchemaLayerMediaTypeZstd: &compression.Zstd,
3334
}
3435
)
3536

image/internal/image/docker_schema2.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,8 @@ func (m *manifestSchema2) convertToManifestOCI1(ctx context.Context, _ *types.Ma
233233
layers[idx].MediaType = imgspecv1.MediaTypeImageLayer
234234
case manifest.DockerV2Schema2LayerMediaType:
235235
layers[idx].MediaType = imgspecv1.MediaTypeImageLayerGzip
236+
case manifest.DockerV2SchemaLayerMediaTypeZstd:
237+
layers[idx].MediaType = imgspecv1.MediaTypeImageLayerZstd
236238
default:
237239
return nil, fmt.Errorf("Unknown media type during manifest conversion: %q", m.m.LayersDescriptors[idx].MediaType)
238240
}

image/internal/image/fixtures/schema2-invalid-media-type.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
},
99
"layers": [
1010
{
11-
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.zstd",
11+
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.invalid",
1212
"size": 51354364,
1313
"digest": "sha256:6a5a5368e0c2d3e5909184fa28ddfd56072e7ff3ee9a945876f7eee5896ef5bb"
1414
},

image/internal/image/oci.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ func (m *manifestOCI1) convertToManifestSchema2(_ context.Context, options *type
288288
case imgspecv1.MediaTypeImageLayerGzip:
289289
layers[idx].MediaType = manifest.DockerV2Schema2LayerMediaType
290290
case imgspecv1.MediaTypeImageLayerZstd:
291-
return nil, fmt.Errorf("Error during manifest conversion: %q: zstd compression is not supported for docker images", layers[idx].MediaType)
291+
return nil, fmt.Errorf("Error during manifest conversion: %q: zstd compression is not officially supported for docker images", layers[idx].MediaType)
292292
case ociencspec.MediaTypeLayerEnc, ociencspec.MediaTypeLayerGzipEnc, ociencspec.MediaTypeLayerZstdEnc,
293293
ociencspec.MediaTypeLayerNonDistributableEnc, ociencspec.MediaTypeLayerNonDistributableGzipEnc, ociencspec.MediaTypeLayerNonDistributableZstdEnc:
294294
return nil, fmt.Errorf("during manifest conversion: encrypted layers (%q) are not supported in docker images", layers[idx].MediaType)

image/internal/manifest/manifest.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ const (
2626
DockerV2Schema2LayerMediaType = "application/vnd.docker.image.rootfs.diff.tar.gzip"
2727
// DockerV2SchemaLayerMediaTypeUncompressed is the mediaType used for uncompressed layers.
2828
DockerV2SchemaLayerMediaTypeUncompressed = "application/vnd.docker.image.rootfs.diff.tar"
29+
// DockerV2Schema2LayerMediaType is the MIME type used for schema 2 layers.
30+
DockerV2SchemaLayerMediaTypeZstd = "application/vnd.docker.image.rootfs.diff.tar.zstd"
2931
// DockerV2ListMediaType MIME type represents Docker manifest schema 2 list
3032
DockerV2ListMediaType = "application/vnd.docker.distribution.manifest.list.v2+json"
3133
// DockerV2Schema2ForeignLayerMediaType is the MIME type used for schema 2 foreign layers.

image/manifest/manifest.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ const (
2626
DockerV2Schema2LayerMediaType = manifest.DockerV2Schema2LayerMediaType
2727
// DockerV2SchemaLayerMediaTypeUncompressed is the mediaType used for uncompressed layers.
2828
DockerV2SchemaLayerMediaTypeUncompressed = manifest.DockerV2SchemaLayerMediaTypeUncompressed
29+
// DockerV2SchemaLayerMediaTypeZstd is the mediaType used for zstd layers.
30+
// Warning: This mediaType is not officially supported in https://github.com/distribution/distribution/blob/main/docs/content/spec/manifest-v2-2.md but some images may exhibit it. Support is partial.
31+
DockerV2SchemaLayerMediaTypeZstd = manifest.DockerV2SchemaLayerMediaTypeZstd
2932
// DockerV2ListMediaType MIME type represents Docker manifest schema 2 list
3033
DockerV2ListMediaType = manifest.DockerV2ListMediaType
3134
// DockerV2Schema2ForeignLayerMediaType is the MIME type used for schema 2 foreign layers.
@@ -41,7 +44,7 @@ type NonImageArtifactError = manifest.NonImageArtifactError
4144
// SupportedSchema2MediaType checks if the specified string is a supported Docker v2s2 media type.
4245
func SupportedSchema2MediaType(m string) error {
4346
switch m {
44-
case DockerV2ListMediaType, DockerV2Schema1MediaType, DockerV2Schema1SignedMediaType, DockerV2Schema2ConfigMediaType, DockerV2Schema2ForeignLayerMediaType, DockerV2Schema2ForeignLayerMediaTypeGzip, DockerV2Schema2LayerMediaType, DockerV2Schema2MediaType, DockerV2SchemaLayerMediaTypeUncompressed:
47+
case DockerV2ListMediaType, DockerV2Schema1MediaType, DockerV2Schema1SignedMediaType, DockerV2Schema2ConfigMediaType, DockerV2Schema2ForeignLayerMediaType, DockerV2Schema2ForeignLayerMediaTypeGzip, DockerV2Schema2LayerMediaType, DockerV2Schema2MediaType, DockerV2SchemaLayerMediaTypeUncompressed, DockerV2SchemaLayerMediaTypeZstd:
4548
return nil
4649
default:
4750
return fmt.Errorf("unsupported docker v2s2 media type: %q", m)

0 commit comments

Comments
 (0)