fix: allow changing media-type when pushing an image tag (#3022)

Fixes #3005

Previously, changing a image's media-type was disallowed.
However, "docker buildx" appears to first push an image manifest and
then an image index for the same image tag. So, allow this.

Signed-off-by: Ramkumar Chinchani <rchincha.dev@gmail.com>
This commit is contained in:
Ramkumar Chinchani
2025-03-11 10:38:47 -07:00
committed by GitHub
parent 0930e57184
commit c87f489a79
3 changed files with 6 additions and 12 deletions
+2 -2
View File
@@ -10835,13 +10835,13 @@ func TestManifestImageIndex(t *testing.T) {
resp, err = resty.R().SetHeader("Content-Type", ispec.MediaTypeImageIndex).
SetBody(content).Put(baseURL + "/v2/index/manifests/test:1.0")
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, http.StatusBadRequest)
So(resp.StatusCode(), ShouldEqual, http.StatusCreated)
// previously an image index, try writing a manifest
resp, err = resty.R().SetHeader("Content-Type", ispec.MediaTypeImageManifest).
SetBody(m1content).Put(baseURL + "/v2/index/manifests/test:index1")
So(err, ShouldBeNil)
So(resp.StatusCode(), ShouldEqual, http.StatusBadRequest)
So(resp.StatusCode(), ShouldEqual, http.StatusCreated)
})
})
})
+2 -8
View File
@@ -250,15 +250,9 @@ func CheckIfIndexNeedsUpdate(index *ispec.Index, desc *ispec.Descriptor,
// changing media-type is disallowed!
if manifest.MediaType != desc.MediaType {
err := zerr.ErrBadManifest
log.Error().Err(err).
log.Info().
Str("old mediaType", manifest.MediaType).
Str("new mediaType", desc.MediaType).Msg("cannot change media-type")
reason := fmt.Sprintf("changing manifest media-type from \"%s\" to \"%s\" is disallowed",
manifest.MediaType, desc.MediaType)
return false, "", zerr.NewError(err).AddDetail("reason", reason)
Str("new mediaType", desc.MediaType).Msg("media-type changed")
}
oldDesc := *desc
+2 -2
View File
@@ -3410,11 +3410,11 @@ func TestS3ManifestImageIndex(t *testing.T) {
So(digest, ShouldNotBeNil)
_, _, err = imgStore.PutImageManifest("index", "test:1.0", ispec.MediaTypeImageIndex, content)
So(err, ShouldNotBeNil)
So(err, ShouldBeNil)
// previously an image index, try writing a manifest
_, _, err = imgStore.PutImageManifest("index", "test:index1", ispec.MediaTypeImageManifest, m1content)
So(err, ShouldNotBeNil)
So(err, ShouldBeNil)
})
})
})