Skip to content

Commit 4aff743

Browse files
committed
Fix possibly incorrect media type default on import
As reported, running import twice without using the compress import option means that the content store will have existing layers during the second import and the existing code hardcodes existing layer media type to compressed. This fixes the issue by actually reading the header bytes from the store and setting the media type appropriately. Signed-off-by: Phil Estes <estesp@amazon.com>
1 parent 2986d5b commit 4aff743

File tree

1 file changed

+31
-1
lines changed

1 file changed

+31
-1
lines changed

images/archive/importer.go

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,9 +269,13 @@ func resolveLayers(ctx context.Context, store content.Store, layerFiles []string
269269
if ok {
270270
desc := descs[digest.Digest(dgst)]
271271
if desc != nil {
272-
desc.MediaType = images.MediaTypeDockerSchema2LayerGzip
273272
desc.Digest = info.Digest
274273
desc.Size = info.Size
274+
mediaType, err := detectLayerMediaType(ctx, store, *desc)
275+
if err != nil {
276+
return fmt.Errorf("failed to detect media type of layer: %w", err)
277+
}
278+
desc.MediaType = mediaType
275279
}
276280
}
277281
return nil
@@ -381,3 +385,29 @@ func writeManifest(ctx context.Context, cs content.Ingester, manifest interface{
381385

382386
return desc, nil
383387
}
388+
389+
func detectLayerMediaType(ctx context.Context, store content.Store, desc ocispec.Descriptor) (string, error) {
390+
var mediaType string
391+
// need to parse existing blob to use the proper media type
392+
bytes := make([]byte, 10)
393+
ra, err := store.ReaderAt(ctx, desc)
394+
if err != nil {
395+
return "", fmt.Errorf("failed to read content store to detect layer media type: %w", err)
396+
}
397+
defer ra.Close()
398+
_, err = ra.ReadAt(bytes, 0)
399+
if err != nil && err != io.EOF {
400+
return "", fmt.Errorf("failed to read header bytes from layer to detect media type: %w", err)
401+
}
402+
if err == io.EOF {
403+
// in the case of an empty layer then the media type should be uncompressed
404+
return images.MediaTypeDockerSchema2Layer, nil
405+
}
406+
switch c := compression.DetectCompression(bytes); c {
407+
case compression.Uncompressed:
408+
mediaType = images.MediaTypeDockerSchema2Layer
409+
default:
410+
mediaType = images.MediaTypeDockerSchema2LayerGzip
411+
}
412+
return mediaType, nil
413+
}

0 commit comments

Comments
 (0)