Merge pull request #6824 from tonistiigi/oci-mediatypes

exporter/containerimage: default to oci-mediatypes=true
This commit is contained in:
Tõnis Tiigi authored and GitHub committed 2026-06-04 08:45:50 -07:00
commit 2ff20da8b4
31 files changed
+477 -117

No files matched your search

+1 -1
View File
@@ -1750,7 +1750,7 @@ func TestGetRemotes(t *testing.T) {
case compression.EStargz:
require.Equal(t, ocispecs.MediaTypeImageLayerGzip, desc.MediaType)
case compression.Zstd:
require.Equal(t, ocispecs.MediaTypeImageLayer+"+zstd", desc.MediaType)
require.Equal(t, ocispecs.MediaTypeImageLayerZstd, desc.MediaType)
default:
require.Fail(t, "unhandled media type", compressionType)
}
+1 -1
View File
@@ -97,7 +97,7 @@ func testBuildExportNydusWithHybrid(t *testing.T, sb integration.Sandbox) {
mediaTypes := map[compression.Type]string{
compression.Gzip: ocispecs.MediaTypeImageLayerGzip,
compression.Zstd: ocispecs.MediaTypeImageLayer + "+zstd",
compression.Zstd: ocispecs.MediaTypeImageLayerZstd,
}
target := fmt.Sprintf("%s/%s/alpine:%s", registry, compType, identity.NewID())
_, err = c.Solve(sb.Context(), def, SolveOpt{
+45 -52
View File
@@ -1465,7 +1465,7 @@ func testPushByDigest(t *testing.T, sb integration.Sandbox) {
require.NoError(t, err)
require.Equal(t, resp.ExporterResponse[exptypes.ExporterImageDigestKey], desc.Digest.String())
require.Equal(t, images.MediaTypeDockerSchema2Manifest, desc.MediaType)
require.Equal(t, ocispecs.MediaTypeImageManifest, desc.MediaType)
require.Greater(t, desc.Size, int64(0))
}
@@ -3209,7 +3209,7 @@ func testSessionExporter(t *testing.T, sb integration.Sandbox) {
require.Equal(t, 2, len(mfst.Layers))
for _, layer := range mfst.Layers {
require.Contains(t, layer.MediaType, "application/vnd.oci.image.layer.v1.tar+zstd")
require.Contains(t, layer.MediaType, ocispecs.MediaTypeImageLayerZstd)
}
}
@@ -3680,9 +3680,9 @@ func testBuildExportScratch(t *testing.T, sb integration.Sandbox) {
imgs, err := testutil.ReadImages(sb.Context(), provider, desc)
require.NoError(t, err)
require.Len(t, imgs.Images, 1)
img := imgs.Find(platforms.Format(platforms.DefaultSpec()))
img := imgs.Images[0]
require.Empty(t, img.Layers)
require.Equal(t, platforms.DefaultSpec(), img.Img.Platform)
require.True(t, platforms.Only(platforms.DefaultSpec()).Match(img.Img.Platform))
desc, provider, err = contentutil.ProviderFromRef(targetMulti)
require.NoError(t, err)
@@ -4362,7 +4362,7 @@ func testMultipleExporters(t *testing.T, sb integration.Sandbox) {
Type: ExporterImage,
Attrs: map[string]string{
"name": target2,
"oci-mediatypes": "true",
"oci-mediatypes": "false",
},
},
}...)
@@ -4430,8 +4430,8 @@ func testMultipleExporters(t *testing.T, sb integration.Sandbox) {
} else {
require.Len(t, ev.Record.Result.Results, 2)
require.Len(t, ev.Record.Exporters, 6)
require.Equal(t, images.MediaTypeDockerSchema2Manifest, ev.Record.Result.Results[0].MediaType)
require.Equal(t, ocispecs.MediaTypeImageManifest, ev.Record.Result.Results[1].MediaType)
require.Equal(t, ocispecs.MediaTypeImageManifest, ev.Record.Result.Results[0].MediaType)
require.Equal(t, images.MediaTypeDockerSchema2Manifest, ev.Record.Result.Results[1].MediaType)
}
require.Equal(t, ev.Record.Result.Results[0], ev.Record.Result.ResultDeprecated)
}
@@ -5439,6 +5439,7 @@ func testBuildExportWithForeignLayer(t *testing.T, sb integration.Sandbox) {
Attrs: map[string]string{
"name": target,
"push": "true",
"oci-mediatypes": "false",
"prefer-nondist-layers": "true",
},
},
@@ -5484,8 +5485,9 @@ func testBuildExportWithForeignLayer(t *testing.T, sb integration.Sandbox) {
{
Type: ExporterImage,
Attrs: map[string]string{
"name": target,
"push": "true",
"name": target,
"push": "true",
"oci-mediatypes": "false",
},
},
},
@@ -5572,7 +5574,7 @@ func testBuildExportWithUncompressed(t *testing.T, sb integration.Sandbox) {
mfst, err := images.Manifest(ctx, client.ContentStore(), img.Target(), nil)
require.NoError(t, err)
require.Equal(t, 1, len(mfst.Layers))
require.Equal(t, images.MediaTypeDockerSchema2Layer, mfst.Layers[0].MediaType)
require.Equal(t, ocispecs.MediaTypeImageLayer, mfst.Layers[0].MediaType)
}
// new layer with gzip compression
@@ -5641,8 +5643,8 @@ func testBuildExportWithUncompressed(t *testing.T, sb integration.Sandbox) {
err = json.Unmarshal(dt, &mfst)
require.NoError(t, err)
require.Equal(t, 2, len(mfst.Layers))
require.Equal(t, images.MediaTypeDockerSchema2Layer, mfst.Layers[0].MediaType)
require.Equal(t, images.MediaTypeDockerSchema2LayerGzip, mfst.Layers[1].MediaType)
require.Equal(t, ocispecs.MediaTypeImageLayer, mfst.Layers[0].MediaType)
require.Equal(t, ocispecs.MediaTypeImageLayerGzip, mfst.Layers[1].MediaType)
dt, err = content.ReadBlob(ctx, img.ContentStore(), ocispecs.Descriptor{Digest: mfst.Layers[0].Digest})
require.NoError(t, err)
@@ -5686,8 +5688,8 @@ func testBuildExportWithUncompressed(t *testing.T, sb integration.Sandbox) {
err = json.Unmarshal(dt, &mfst)
require.NoError(t, err)
require.Equal(t, 2, len(mfst.Layers))
require.Equal(t, images.MediaTypeDockerSchema2LayerGzip, mfst.Layers[0].MediaType)
require.Equal(t, images.MediaTypeDockerSchema2LayerGzip, mfst.Layers[1].MediaType)
require.Equal(t, ocispecs.MediaTypeImageLayerGzip, mfst.Layers[0].MediaType)
require.Equal(t, ocispecs.MediaTypeImageLayerGzip, mfst.Layers[1].MediaType)
dt, err = content.ReadBlob(ctx, img.ContentStore(), ocispecs.Descriptor{Digest: mfst.Layers[0].Digest})
require.NoError(t, err)
@@ -5775,7 +5777,7 @@ func testBuildExportZstd(t *testing.T, sb integration.Sandbox) {
require.NoError(t, err)
lastLayer := mfst.Layers[len(mfst.Layers)-1]
require.Equal(t, ocispecs.MediaTypeImageLayer+"+zstd", lastLayer.MediaType)
require.Equal(t, ocispecs.MediaTypeImageLayerZstd, lastLayer.MediaType)
zstdLayerDigest := lastLayer.Digest.Hex()
require.Equal(t, []byte{0x28, 0xb5, 0x2f, 0xfd}, m[ocispecs.ImageBlobsDir+"/sha256/"+zstdLayerDigest].Data[:4])
@@ -5811,7 +5813,7 @@ func testBuildExportZstd(t *testing.T, sb integration.Sandbox) {
require.NoError(t, err)
lastLayer = mfst.Layers[len(mfst.Layers)-1]
require.Equal(t, images.MediaTypeDockerSchema2Layer+".zstd", lastLayer.MediaType)
require.Equal(t, images.MediaTypeDockerSchema2LayerZstd, lastLayer.MediaType)
require.Equal(t, lastLayer.Digest.Hex(), zstdLayerDigest)
}
@@ -5905,9 +5907,9 @@ func testPullZstdImage(t *testing.T, sb integration.Sandbox) {
firstLayer := mfst.Layers[0]
if ociMediaTypes {
require.Equal(t, ocispecs.MediaTypeImageLayer+"+zstd", firstLayer.MediaType)
require.Equal(t, ocispecs.MediaTypeImageLayerZstd, firstLayer.MediaType)
} else {
require.Equal(t, images.MediaTypeDockerSchema2Layer+".zstd", firstLayer.MediaType)
require.Equal(t, images.MediaTypeDockerSchema2LayerZstd, firstLayer.MediaType)
}
zstdLayerDigest := firstLayer.Digest.Hex()
@@ -6062,10 +6064,10 @@ func testBuildPushAndValidate(t *testing.T, sb integration.Sandbox) {
err = json.Unmarshal(dt, &mfst)
require.NoError(t, err)
require.Equal(t, images.MediaTypeDockerSchema2Manifest, mfst.MediaType)
require.Equal(t, ocispecs.MediaTypeImageManifest, mfst.MediaType)
require.Equal(t, 3, len(mfst.Layers))
require.Equal(t, images.MediaTypeDockerSchema2LayerGzip, mfst.Layers[0].MediaType)
require.Equal(t, images.MediaTypeDockerSchema2LayerGzip, mfst.Layers[1].MediaType)
require.Equal(t, ocispecs.MediaTypeImageLayerGzip, mfst.Layers[0].MediaType)
require.Equal(t, ocispecs.MediaTypeImageLayerGzip, mfst.Layers[1].MediaType)
dt, err = content.ReadBlob(ctx, img.ContentStore(), ocispecs.Descriptor{Digest: mfst.Layers[0].Digest})
require.NoError(t, err)
@@ -6826,7 +6828,7 @@ func testZstdLocalCacheExport(t *testing.T, sb integration.Sandbox) {
require.NoError(t, err)
lastLayer := layerIndex.Manifests[len(layerIndex.Manifests)-2]
require.Equal(t, ocispecs.MediaTypeImageLayer+"+zstd", lastLayer.MediaType)
require.Equal(t, ocispecs.MediaTypeImageLayerZstd, lastLayer.MediaType)
zstdLayerDigest := lastLayer.Digest.Hex()
dt, err = os.ReadFile(filepath.Join(destDir, ocispecs.ImageBlobsDir+"/sha256/"+zstdLayerDigest))
@@ -10471,7 +10473,7 @@ func testExportAnnotationsMediaTypes(t *testing.T, sb integration.Sandbox) {
require.Equal(t, "b", imgs.Images[0].Manifest.Annotations["a"])
require.Equal(t, "d", imgs2.Index.Annotations["c"])
require.Equal(t, images.MediaTypeDockerSchema2ManifestList, imgs.Index.MediaType)
require.Equal(t, ocispecs.MediaTypeImageIndex, imgs.Index.MediaType)
require.Equal(t, ocispecs.MediaTypeImageIndex, imgs2.Index.MediaType)
}
@@ -11144,7 +11146,7 @@ func testSBOMScan(t *testing.T, sb integration.Sandbox) {
scannerFrontend := func(ctx context.Context, c gateway.Client) (*gateway.Result, error) {
res := gateway.NewResult()
st := llb.Image("busybox")
st := llb.Image("busybox", llb.Platform(p))
def, err := st.Marshal(sb.Context())
require.NoError(t, err)
@@ -11162,16 +11164,7 @@ func testSBOMScan(t *testing.T, sb integration.Sandbox) {
if err != nil {
return nil, err
}
res.AddRef(pk, ref)
expPlatforms := &exptypes.Platforms{
Platforms: []exptypes.Platform{{ID: pk, Platform: p}},
}
dt, err := json.Marshal(expPlatforms)
if err != nil {
return nil, err
}
res.AddMeta(exptypes.ExporterPlatformsKey, dt)
res.SetRef(ref)
var img ocispecs.Image
cmd := `
@@ -11195,7 +11188,7 @@ EOF
if err != nil {
return nil, errors.Wrapf(err, "failed to marshal image config")
}
res.AddMeta(fmt.Sprintf("%s/%s", exptypes.ExporterImageConfigKey, pk), config)
res.AddMeta(exptypes.ExporterImageConfigKey, config)
return res, nil
}
@@ -11206,8 +11199,9 @@ EOF
{
Type: ExporterImage,
Attrs: map[string]string{
"name": scannerTarget,
"push": "true",
"name": scannerTarget,
"push": "true",
"oci-mediatypes": "false",
},
},
},
@@ -11497,7 +11491,7 @@ func testSBOMScanSingleRef(t *testing.T, sb integration.Sandbox) {
scannerFrontend := func(ctx context.Context, c gateway.Client) (*gateway.Result, error) {
res := gateway.NewResult()
st := llb.Image("busybox")
st := llb.Image("busybox", llb.Platform(p))
def, err := st.Marshal(sb.Context())
require.NoError(t, err)
@@ -11515,16 +11509,7 @@ func testSBOMScanSingleRef(t *testing.T, sb integration.Sandbox) {
if err != nil {
return nil, err
}
res.AddRef(pk, ref)
expPlatforms := &exptypes.Platforms{
Platforms: []exptypes.Platform{{ID: pk, Platform: p}},
}
dt, err := json.Marshal(expPlatforms)
if err != nil {
return nil, err
}
res.AddMeta(exptypes.ExporterPlatformsKey, dt)
res.SetRef(ref)
var img ocispecs.Image
cmd := `
@@ -11542,7 +11527,7 @@ EOF
if err != nil {
return nil, errors.Wrapf(err, "failed to marshal image config")
}
res.AddMeta(fmt.Sprintf("%s/%s", exptypes.ExporterImageConfigKey, pk), config)
res.AddMeta(exptypes.ExporterImageConfigKey, config)
return res, nil
}
@@ -11553,8 +11538,9 @@ EOF
{
Type: ExporterImage,
Attrs: map[string]string{
"name": scannerTarget,
"push": "true",
"name": scannerTarget,
"push": "true",
"oci-mediatypes": "false",
},
},
},
@@ -11633,7 +11619,14 @@ EOF
require.NoError(t, err)
require.Equal(t, 2, len(imgs.Images))
img := imgs.Find(pk)
var img *testutil.ImageInfo
for _, candidate := range imgs.Images {
if candidate.Desc.Platform != nil && platforms.Format(*candidate.Desc.Platform) == "unknown/unknown" {
continue
}
img = candidate
break
}
require.NotNil(t, img)
require.Equal(t, []string{"/bin/sh", "-c", "cat /greeting"}, img.Img.Config.Cmd)
@@ -0,0 +1 @@
{"architecture":"amd64","config":{"Hostname":"","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["sh"],"Image":"sha256:919de79e94ce464098cec8a4796f27aa2d0c93985e27f6a157c8bbb557568013","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"container":"adfa050237a5fcf9f1e5ad6351b3665e4b99e0c12f33bdd3535b8fb001f9dd2e","container_config":{"Hostname":"adfa050237a5","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["/bin/sh","-c","#(nop) ","CMD [\"sh\"]"],"Image":"sha256:919de79e94ce464098cec8a4796f27aa2d0c93985e27f6a157c8bbb557568013","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":{}},"created":"2015-10-21T07:28:00Z","docker_version":"20.10.23","history":[{"created":"2015-10-21T07:28:00Z","created_by":"/bin/sh -c #(nop) ADD file:7e9002edaafd4e4579b65c8f0aaabde1aeb7fd3f8d95579f7fd3443cef785fd1 in / "},{"created":"2015-10-21T07:28:00Z","created_by":"/bin/sh -c #(nop) CMD [\"sh\"]","empty_layer":true},{"created":"2015-10-21T07:28:00Z","created_by":"mkdir /proc, mkdir /sys, mkdir /base, mkfile /base/base.txt","comment":"buildkit.exporter.image.v0"},{"created":"2015-10-21T07:28:00Z","created_by":"mkdir /inputs/git, mkfile /inputs/llb.txt, copy /artifact.txt /inputs/http.txt, copy /git.txt /inputs/git/git.txt, copy /sub/nested.txt /inputs/git/nested.txt","comment":"buildkit.exporter.image.v0"},{"created":"2015-10-21T07:28:00Z","created_by":"mount / from exec sh -eux -c \nmkdir -p /generated/deeper\necho exec-fixture \u003e /generated/exec.txt\necho nested-exec \u003e /generated/deeper/nested.txt\n","comment":"buildkit.exporter.image.v0"}],"os":"linux","rootfs":{"type":"layers","diff_ids":["sha256:fe4922f0a3ca2aa707ca0f8cc53937e947fec1157a09302baf11904258d67d17","sha256:007165e99d6304af5653e8a8cc1c8886e5719cf31bf09cbd9f50fa09008ef654","sha256:9228085939d1444bd500ac8a4f8ee9d39fed1e5905da0968ffed61887ab41042","sha256:672c0da84adab23797eebbf41315e289f03b02e266bdd6f6e88a7736583a4466"]}}
@@ -0,0 +1,43 @@
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": {
"mediaType": "application/vnd.oci.image.config.v1+json",
"digest": "sha256:1772fd0a3b45a62fc5e23737bf8aa63ea2cb178a02e57cec4d14ef9e6fcc4c95",
"size": 2295
},
"layers": [
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:430ee4fa77d640d42de0c6357e4cff7249712a28284310bda8293050c6cbc5d8",
"size": 2219886,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:48cef04b9e3890175d531912bd6307b344eb1d16caba14f32989e8034466dde4",
"size": 175,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:3096f0079befb9bacfab7003f9de4604477e81ef1cd0d4bb9f967db5aba7bebc",
"size": 242,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:163f5dbfba981d0b1e6e9c5a1ba003efa40e7e7d38e8471653e1f1b2abd370d9",
"size": 201,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
}
]
}
@@ -0,0 +1 @@
{"architecture":"amd64","config":{"Hostname":"","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["sh"],"Image":"sha256:919de79e94ce464098cec8a4796f27aa2d0c93985e27f6a157c8bbb557568013","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"container":"adfa050237a5fcf9f1e5ad6351b3665e4b99e0c12f33bdd3535b8fb001f9dd2e","container_config":{"Hostname":"adfa050237a5","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["/bin/sh","-c","#(nop) ","CMD [\"sh\"]"],"Image":"sha256:919de79e94ce464098cec8a4796f27aa2d0c93985e27f6a157c8bbb557568013","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":{}},"created":"2015-10-21T07:28:00Z","docker_version":"20.10.23","history":[{"created":"2015-10-21T07:28:00Z","created_by":"/bin/sh -c #(nop) ADD file:7e9002edaafd4e4579b65c8f0aaabde1aeb7fd3f8d95579f7fd3443cef785fd1 in / "},{"created":"2015-10-21T07:28:00Z","created_by":"/bin/sh -c #(nop) CMD [\"sh\"]","empty_layer":true},{"created":"2015-10-21T07:28:00Z","created_by":"mkdir /proc, mkdir /sys, mkdir /base, mkfile /base/base.txt","comment":"buildkit.exporter.image.v0"},{"created":"2015-10-21T07:28:00Z","created_by":"mkdir /inputs/git, mkfile /inputs/llb.txt, copy /artifact.txt /inputs/http.txt, copy /git.txt /inputs/git/git.txt, copy /sub/nested.txt /inputs/git/nested.txt","comment":"buildkit.exporter.image.v0"},{"created":"2015-10-21T07:28:00Z","created_by":"mount / from exec sh -eux -c \nmkdir -p /generated/deeper\necho exec-fixture \u003e /generated/exec.txt\necho nested-exec \u003e /generated/deeper/nested.txt\n","comment":"buildkit.exporter.image.v0"}],"os":"linux","rootfs":{"type":"layers","diff_ids":["sha256:fe4922f0a3ca2aa707ca0f8cc53937e947fec1157a09302baf11904258d67d17","sha256:007165e99d6304af5653e8a8cc1c8886e5719cf31bf09cbd9f50fa09008ef654","sha256:9228085939d1444bd500ac8a4f8ee9d39fed1e5905da0968ffed61887ab41042","sha256:672c0da84adab23797eebbf41315e289f03b02e266bdd6f6e88a7736583a4466"]}}
@@ -0,0 +1,43 @@
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": {
"mediaType": "application/vnd.oci.image.config.v1+json",
"digest": "sha256:1772fd0a3b45a62fc5e23737bf8aa63ea2cb178a02e57cec4d14ef9e6fcc4c95",
"size": 2295
},
"layers": [
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:3b2645dc700f1550f22b0915aea1fb70755d0cccd4171499c7a18f396a284d48",
"size": 4492656,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:426dfb571c2a1f52cb66e0a69fbe2348348afc4ba893cba5754a841882d91773",
"size": 3612,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:5c3240cc0bcdc46a4ff085359eba4d0ffe7e5e161c5f376e79f2264719041668",
"size": 6172,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:847e9b228e5b81db2fe943892d3602808b8f94ec498afe963a23bf8ab1d39a26",
"size": 4124,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
}
]
}
@@ -0,0 +1 @@
{"architecture":"amd64","config":{"Hostname":"","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["sh"],"Image":"sha256:919de79e94ce464098cec8a4796f27aa2d0c93985e27f6a157c8bbb557568013","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"container":"adfa050237a5fcf9f1e5ad6351b3665e4b99e0c12f33bdd3535b8fb001f9dd2e","container_config":{"Hostname":"adfa050237a5","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["/bin/sh","-c","#(nop) ","CMD [\"sh\"]"],"Image":"sha256:919de79e94ce464098cec8a4796f27aa2d0c93985e27f6a157c8bbb557568013","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":{}},"created":"2015-10-21T07:28:00Z","docker_version":"20.10.23","history":[{"created":"2015-10-21T07:28:00Z","created_by":"/bin/sh -c #(nop) ADD file:7e9002edaafd4e4579b65c8f0aaabde1aeb7fd3f8d95579f7fd3443cef785fd1 in / "},{"created":"2015-10-21T07:28:00Z","created_by":"/bin/sh -c #(nop) CMD [\"sh\"]","empty_layer":true},{"created":"2015-10-21T07:28:00Z","created_by":"mkdir /proc, mkdir /sys, mkdir /base, mkfile /base/base.txt","comment":"buildkit.exporter.image.v0"},{"created":"2015-10-21T07:28:00Z","created_by":"mkdir /inputs/git, mkfile /inputs/llb.txt, copy /artifact.txt /inputs/http.txt, copy /git.txt /inputs/git/git.txt, copy /sub/nested.txt /inputs/git/nested.txt","comment":"buildkit.exporter.image.v0"},{"created":"2015-10-21T07:28:00Z","created_by":"mount / from exec sh -eux -c \nmkdir -p /generated/deeper\necho exec-fixture \u003e /generated/exec.txt\necho nested-exec \u003e /generated/deeper/nested.txt\n","comment":"buildkit.exporter.image.v0"}],"os":"linux","rootfs":{"type":"layers","diff_ids":["sha256:fe4922f0a3ca2aa707ca0f8cc53937e947fec1157a09302baf11904258d67d17","sha256:007165e99d6304af5653e8a8cc1c8886e5719cf31bf09cbd9f50fa09008ef654","sha256:9228085939d1444bd500ac8a4f8ee9d39fed1e5905da0968ffed61887ab41042","sha256:672c0da84adab23797eebbf41315e289f03b02e266bdd6f6e88a7736583a4466"]}}
@@ -0,0 +1,43 @@
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": {
"mediaType": "application/vnd.oci.image.config.v1+json",
"digest": "sha256:1772fd0a3b45a62fc5e23737bf8aa63ea2cb178a02e57cec4d14ef9e6fcc4c95",
"size": 2295
},
"layers": [
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:86961eaccfc75a8eea4385f921d5aa55c8bb752f1c92a7c3189ae4a4fc37a45c",
"size": 2216704,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:f39e671d2c987aa1cedb5d830a68d394ce7f72502ec50d6bd11efaa71bb697d2",
"size": 168,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:ba67dd0bb35371d02be3b950c6d617e1f22f55861fc5a7d0d354c8fbb2f77b56",
"size": 228,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:ca66b99f9916a22accc57a790d407b442a10791859f9d0a6b6c8108857c3c608",
"size": 187,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
}
]
}
@@ -0,0 +1 @@
{"architecture":"amd64","config":{"Hostname":"","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["sh"],"Image":"sha256:919de79e94ce464098cec8a4796f27aa2d0c93985e27f6a157c8bbb557568013","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"container":"adfa050237a5fcf9f1e5ad6351b3665e4b99e0c12f33bdd3535b8fb001f9dd2e","container_config":{"Hostname":"adfa050237a5","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["/bin/sh","-c","#(nop) ","CMD [\"sh\"]"],"Image":"sha256:919de79e94ce464098cec8a4796f27aa2d0c93985e27f6a157c8bbb557568013","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":{}},"created":"2015-10-21T07:28:00Z","docker_version":"20.10.23","history":[{"created":"2015-10-21T07:28:00Z","created_by":"/bin/sh -c #(nop) ADD file:7e9002edaafd4e4579b65c8f0aaabde1aeb7fd3f8d95579f7fd3443cef785fd1 in / "},{"created":"2015-10-21T07:28:00Z","created_by":"/bin/sh -c #(nop) CMD [\"sh\"]","empty_layer":true},{"created":"2015-10-21T07:28:00Z","created_by":"mkdir /proc, mkdir /sys, mkdir /base, mkfile /base/base.txt","comment":"buildkit.exporter.image.v0"},{"created":"2015-10-21T07:28:00Z","created_by":"mkdir /inputs/git, mkfile /inputs/llb.txt, copy /artifact.txt /inputs/http.txt, copy /git.txt /inputs/git/git.txt, copy /sub/nested.txt /inputs/git/nested.txt","comment":"buildkit.exporter.image.v0"},{"created":"2015-10-21T07:28:00Z","created_by":"mount / from exec sh -eux -c \nmkdir -p /generated/deeper\necho exec-fixture \u003e /generated/exec.txt\necho nested-exec \u003e /generated/deeper/nested.txt\n","comment":"buildkit.exporter.image.v0"}],"os":"linux","rootfs":{"type":"layers","diff_ids":["sha256:fe4922f0a3ca2aa707ca0f8cc53937e947fec1157a09302baf11904258d67d17","sha256:007165e99d6304af5653e8a8cc1c8886e5719cf31bf09cbd9f50fa09008ef654","sha256:9228085939d1444bd500ac8a4f8ee9d39fed1e5905da0968ffed61887ab41042","sha256:672c0da84adab23797eebbf41315e289f03b02e266bdd6f6e88a7736583a4466"]}}
@@ -0,0 +1,46 @@
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": {
"mediaType": "application/vnd.oci.image.config.v1+json",
"digest": "sha256:1772fd0a3b45a62fc5e23737bf8aa63ea2cb178a02e57cec4d14ef9e6fcc4c95",
"size": 2295
},
"layers": [
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:430ee4fa77d640d42de0c6357e4cff7249712a28284310bda8293050c6cbc5d8",
"size": 2219886,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:48cef04b9e3890175d531912bd6307b344eb1d16caba14f32989e8034466dde4",
"size": 175,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:3096f0079befb9bacfab7003f9de4604477e81ef1cd0d4bb9f967db5aba7bebc",
"size": 242,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:163f5dbfba981d0b1e6e9c5a1ba003efa40e7e7d38e8471653e1f1b2abd370d9",
"size": 201,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
}
],
"annotations": {
"org.opencontainers.image.title": "compatibility-test"
}
}
@@ -0,0 +1 @@
{"architecture":"amd64","config":{"Hostname":"","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["sh"],"Image":"sha256:919de79e94ce464098cec8a4796f27aa2d0c93985e27f6a157c8bbb557568013","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"container":"adfa050237a5fcf9f1e5ad6351b3665e4b99e0c12f33bdd3535b8fb001f9dd2e","container_config":{"Hostname":"adfa050237a5","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["/bin/sh","-c","#(nop) ","CMD [\"sh\"]"],"Image":"sha256:919de79e94ce464098cec8a4796f27aa2d0c93985e27f6a157c8bbb557568013","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":{}},"created":"2015-10-21T07:28:00Z","docker_version":"20.10.23","history":[{"created":"2015-10-21T07:28:00Z","created_by":"/bin/sh -c #(nop) ADD file:7e9002edaafd4e4579b65c8f0aaabde1aeb7fd3f8d95579f7fd3443cef785fd1 in / "},{"created":"2015-10-21T07:28:00Z","created_by":"/bin/sh -c #(nop) CMD [\"sh\"]","empty_layer":true},{"created":"2015-10-21T07:28:00Z","created_by":"mkdir /proc, mkdir /sys, mkdir /base, mkfile /base/base.txt","comment":"buildkit.exporter.image.v0"},{"created":"2015-10-21T07:28:00Z","created_by":"mkdir /inputs/git, mkfile /inputs/llb.txt, copy /artifact.txt /inputs/http.txt, copy /git.txt /inputs/git/git.txt, copy /sub/nested.txt /inputs/git/nested.txt","comment":"buildkit.exporter.image.v0"},{"created":"2015-10-21T07:28:00Z","created_by":"mount / from exec sh -eux -c \nmkdir -p /generated/deeper\necho exec-fixture \u003e /generated/exec.txt\necho nested-exec \u003e /generated/deeper/nested.txt\n","comment":"buildkit.exporter.image.v0"}],"os":"linux","rootfs":{"type":"layers","diff_ids":["sha256:fe4922f0a3ca2aa707ca0f8cc53937e947fec1157a09302baf11904258d67d17","sha256:007165e99d6304af5653e8a8cc1c8886e5719cf31bf09cbd9f50fa09008ef654","sha256:9228085939d1444bd500ac8a4f8ee9d39fed1e5905da0968ffed61887ab41042","sha256:672c0da84adab23797eebbf41315e289f03b02e266bdd6f6e88a7736583a4466"]}}
@@ -0,0 +1,43 @@
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": {
"mediaType": "application/vnd.oci.image.config.v1+json",
"digest": "sha256:1772fd0a3b45a62fc5e23737bf8aa63ea2cb178a02e57cec4d14ef9e6fcc4c95",
"size": 2295
},
"layers": [
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:430ee4fa77d640d42de0c6357e4cff7249712a28284310bda8293050c6cbc5d8",
"size": 2219886,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:48cef04b9e3890175d531912bd6307b344eb1d16caba14f32989e8034466dde4",
"size": 175,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:3096f0079befb9bacfab7003f9de4604477e81ef1cd0d4bb9f967db5aba7bebc",
"size": 242,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:163f5dbfba981d0b1e6e9c5a1ba003efa40e7e7d38e8471653e1f1b2abd370d9",
"size": 201,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
}
]
}
@@ -0,0 +1 @@
{"architecture":"amd64","config":{"Hostname":"","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["sh"],"Image":"sha256:919de79e94ce464098cec8a4796f27aa2d0c93985e27f6a157c8bbb557568013","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"container":"adfa050237a5fcf9f1e5ad6351b3665e4b99e0c12f33bdd3535b8fb001f9dd2e","container_config":{"Hostname":"adfa050237a5","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["/bin/sh","-c","#(nop) ","CMD [\"sh\"]"],"Image":"sha256:919de79e94ce464098cec8a4796f27aa2d0c93985e27f6a157c8bbb557568013","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":{}},"created":"2015-10-21T07:28:00Z","docker_version":"20.10.23","history":[{"created":"2015-10-21T07:28:00Z","created_by":"/bin/sh -c #(nop) ADD file:7e9002edaafd4e4579b65c8f0aaabde1aeb7fd3f8d95579f7fd3443cef785fd1 in / "},{"created":"2015-10-21T07:28:00Z","created_by":"/bin/sh -c #(nop) CMD [\"sh\"]","empty_layer":true},{"created":"2015-10-21T07:28:00Z","created_by":"mkdir /proc, mkdir /sys, mkdir /base, mkfile /base/base.txt","comment":"buildkit.exporter.image.v0"},{"created":"2015-10-21T07:28:00Z","created_by":"mkdir /inputs/git, mkfile /inputs/llb.txt, copy /artifact.txt /inputs/http.txt, copy /git.txt /inputs/git/git.txt, copy /sub/nested.txt /inputs/git/nested.txt","comment":"buildkit.exporter.image.v0"},{"created":"2015-10-21T07:28:00Z","created_by":"mount / from exec sh -eux -c \nmkdir -p /generated/deeper\necho exec-fixture \u003e /generated/exec.txt\necho nested-exec \u003e /generated/deeper/nested.txt\n","comment":"buildkit.exporter.image.v0"}],"os":"linux","rootfs":{"type":"layers","diff_ids":["sha256:fe4922f0a3ca2aa707ca0f8cc53937e947fec1157a09302baf11904258d67d17","sha256:007165e99d6304af5653e8a8cc1c8886e5719cf31bf09cbd9f50fa09008ef654","sha256:9228085939d1444bd500ac8a4f8ee9d39fed1e5905da0968ffed61887ab41042","sha256:672c0da84adab23797eebbf41315e289f03b02e266bdd6f6e88a7736583a4466"]}}
@@ -0,0 +1,43 @@
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": {
"mediaType": "application/vnd.oci.image.config.v1+json",
"digest": "sha256:1772fd0a3b45a62fc5e23737bf8aa63ea2cb178a02e57cec4d14ef9e6fcc4c95",
"size": 2295
},
"layers": [
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:430ee4fa77d640d42de0c6357e4cff7249712a28284310bda8293050c6cbc5d8",
"size": 2219886,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:48cef04b9e3890175d531912bd6307b344eb1d16caba14f32989e8034466dde4",
"size": 175,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:3096f0079befb9bacfab7003f9de4604477e81ef1cd0d4bb9f967db5aba7bebc",
"size": 242,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"digest": "sha256:163f5dbfba981d0b1e6e9c5a1ba003efa40e7e7d38e8471653e1f1b2abd370d9",
"size": 201,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
}
]
}
@@ -0,0 +1 @@
{"architecture":"amd64","config":{"Hostname":"","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["sh"],"Image":"sha256:919de79e94ce464098cec8a4796f27aa2d0c93985e27f6a157c8bbb557568013","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"container":"adfa050237a5fcf9f1e5ad6351b3665e4b99e0c12f33bdd3535b8fb001f9dd2e","container_config":{"Hostname":"adfa050237a5","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["/bin/sh","-c","#(nop) ","CMD [\"sh\"]"],"Image":"sha256:919de79e94ce464098cec8a4796f27aa2d0c93985e27f6a157c8bbb557568013","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":{}},"created":"2015-10-21T07:28:00Z","docker_version":"20.10.23","history":[{"created":"2015-10-21T07:28:00Z","created_by":"/bin/sh -c #(nop) ADD file:7e9002edaafd4e4579b65c8f0aaabde1aeb7fd3f8d95579f7fd3443cef785fd1 in / "},{"created":"2015-10-21T07:28:00Z","created_by":"/bin/sh -c #(nop) CMD [\"sh\"]","empty_layer":true},{"created":"2015-10-21T07:28:00Z","created_by":"mkdir /proc, mkdir /sys, mkdir /base, mkfile /base/base.txt","comment":"buildkit.exporter.image.v0"},{"created":"2015-10-21T07:28:00Z","created_by":"mkdir /inputs/git, mkfile /inputs/llb.txt, copy /artifact.txt /inputs/http.txt, copy /git.txt /inputs/git/git.txt, copy /sub/nested.txt /inputs/git/nested.txt","comment":"buildkit.exporter.image.v0"},{"created":"2015-10-21T07:28:00Z","created_by":"mount / from exec sh -eux -c \nmkdir -p /generated/deeper\necho exec-fixture \u003e /generated/exec.txt\necho nested-exec \u003e /generated/deeper/nested.txt\n","comment":"buildkit.exporter.image.v0"}],"os":"linux","rootfs":{"type":"layers","diff_ids":["sha256:fe4922f0a3ca2aa707ca0f8cc53937e947fec1157a09302baf11904258d67d17","sha256:007165e99d6304af5653e8a8cc1c8886e5719cf31bf09cbd9f50fa09008ef654","sha256:9228085939d1444bd500ac8a4f8ee9d39fed1e5905da0968ffed61887ab41042","sha256:672c0da84adab23797eebbf41315e289f03b02e266bdd6f6e88a7736583a4466"]}}
@@ -0,0 +1,43 @@
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": {
"mediaType": "application/vnd.oci.image.config.v1+json",
"digest": "sha256:1772fd0a3b45a62fc5e23737bf8aa63ea2cb178a02e57cec4d14ef9e6fcc4c95",
"size": 2295
},
"layers": [
{
"mediaType": "application/vnd.oci.image.layer.v1.tar",
"digest": "sha256:fe4922f0a3ca2aa707ca0f8cc53937e947fec1157a09302baf11904258d67d17",
"size": 4492288,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar",
"digest": "sha256:007165e99d6304af5653e8a8cc1c8886e5719cf31bf09cbd9f50fa09008ef654",
"size": 3584,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar",
"digest": "sha256:9228085939d1444bd500ac8a4f8ee9d39fed1e5905da0968ffed61887ab41042",
"size": 6144,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar",
"digest": "sha256:672c0da84adab23797eebbf41315e289f03b02e266bdd6f6e88a7736583a4466",
"size": 4096,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
}
]
}
@@ -0,0 +1 @@
{"architecture":"amd64","config":{"Hostname":"","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["sh"],"Image":"sha256:919de79e94ce464098cec8a4796f27aa2d0c93985e27f6a157c8bbb557568013","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"container":"adfa050237a5fcf9f1e5ad6351b3665e4b99e0c12f33bdd3535b8fb001f9dd2e","container_config":{"Hostname":"adfa050237a5","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["/bin/sh","-c","#(nop) ","CMD [\"sh\"]"],"Image":"sha256:919de79e94ce464098cec8a4796f27aa2d0c93985e27f6a157c8bbb557568013","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":{}},"created":"2015-10-21T07:28:00Z","docker_version":"20.10.23","history":[{"created":"2015-10-21T07:28:00Z","created_by":"/bin/sh -c #(nop) ADD file:7e9002edaafd4e4579b65c8f0aaabde1aeb7fd3f8d95579f7fd3443cef785fd1 in / "},{"created":"2015-10-21T07:28:00Z","created_by":"/bin/sh -c #(nop) CMD [\"sh\"]","empty_layer":true},{"created":"2015-10-21T07:28:00Z","created_by":"mkdir /proc, mkdir /sys, mkdir /base, mkfile /base/base.txt","comment":"buildkit.exporter.image.v0"},{"created":"2015-10-21T07:28:00Z","created_by":"mkdir /inputs/git, mkfile /inputs/llb.txt, copy /artifact.txt /inputs/http.txt, copy /git.txt /inputs/git/git.txt, copy /sub/nested.txt /inputs/git/nested.txt","comment":"buildkit.exporter.image.v0"},{"created":"2015-10-21T07:28:00Z","created_by":"mount / from exec sh -eux -c \nmkdir -p /generated/deeper\necho exec-fixture \u003e /generated/exec.txt\necho nested-exec \u003e /generated/deeper/nested.txt\n","comment":"buildkit.exporter.image.v0"}],"os":"linux","rootfs":{"type":"layers","diff_ids":["sha256:fe4922f0a3ca2aa707ca0f8cc53937e947fec1157a09302baf11904258d67d17","sha256:007165e99d6304af5653e8a8cc1c8886e5719cf31bf09cbd9f50fa09008ef654","sha256:9228085939d1444bd500ac8a4f8ee9d39fed1e5905da0968ffed61887ab41042","sha256:672c0da84adab23797eebbf41315e289f03b02e266bdd6f6e88a7736583a4466"]}}
@@ -0,0 +1,43 @@
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": {
"mediaType": "application/vnd.oci.image.config.v1+json",
"digest": "sha256:1772fd0a3b45a62fc5e23737bf8aa63ea2cb178a02e57cec4d14ef9e6fcc4c95",
"size": 2295
},
"layers": [
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+zstd",
"digest": "sha256:732ad1c88bfbc8aa6f9d98b0aa872a79298affbec456265500477eaf7b3acad4",
"size": 1997110,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+zstd",
"digest": "sha256:72a37ade5c8308d1328a61790c83d4f6cc2e6a18cdbf96f17058766d61758100",
"size": 170,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+zstd",
"digest": "sha256:cdd742478917b2382493c0c3ccf484ffa94833015e81b7b084c608bb8405affa",
"size": 232,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+zstd",
"digest": "sha256:ef0abf1996faa0809cea6e2f7f971089f5990894c5b267927f9776e073a75325",
"size": 186,
"annotations": {
"buildkit/rewritten-timestamp": "1445412480"
}
}
]
}
+14 -3
View File
@@ -88,13 +88,24 @@ See also the [documentation](/frontend/dockerfile/docs/reference.md#buildkit-bui
BuildKit currently supports these values:
- `10` for the `v0.13.0` and `v0.14.0` historical path
- `20` for the `v0.15.0+` path and current behavior
- `20` for the `v0.15.0` through `v0.31.x` path
- `30` for the current path
### `30`
`30` is the current compatibility version.
Compared to `20`, `30` changes the default image exporter media type behavior:
- when `oci-mediatypes` is not set, image exports default to OCI media types
### `20`
`20` is the current compatibility version.
`20` represents the historical `v0.15.0` through `v0.31.x` path.
It matches released BuildKit output from `v0.15.0` and newer for the compatibility test matrix in `client/compatibility_test.go`.
It matches the `v0.15.0` through `v0.31.x` output covered by the compatibility test matrix in `client/compatibility_test.go`.
Compared to `30`, image exports that do not set `oci-mediatypes` keep the historical `20` media type behavior. Image exports without attestations default to Docker media types. Image exports with attestations use OCI media types because attestations require them.
### `10`
+9
View File
@@ -27,6 +27,7 @@ import (
"github.com/moby/buildkit/exporter/containerimage/exptypes"
"github.com/moby/buildkit/session"
"github.com/moby/buildkit/snapshot"
"github.com/moby/buildkit/solver/llbsolver/compat"
"github.com/moby/buildkit/util/compression"
"github.com/moby/buildkit/util/contentutil"
"github.com/moby/buildkit/util/errutil"
@@ -232,6 +233,7 @@ func (e *imageExporterInstance) Export(ctx context.Context, src *exporter.Source
return nil, nil, nil, err
}
opts.Annotations = opts.Annotations.Merge(as)
opts.SetOCITypesDefault(defaultImageOCITypes(buildInfo.CompatibilityVersion, src))
ctx, done, err := leaseutil.WithLease(ctx, e.opt.LeaseManager, leaseutil.MakeTemporary)
if err != nil {
@@ -577,6 +579,13 @@ func addAnnotations(m map[digest.Digest]map[string]string, desc ocispecs.Descrip
maps.Copy(a, desc.Annotations)
}
func defaultImageOCITypes(compatibilityVersion int, src *exporter.Source) bool {
if compatibilityVersion >= compat.CompatibilityVersion031 {
return true
}
return len(src.Attestations) > 0
}
func NewDescriptorReference(desc ocispecs.Descriptor, release func(context.Context) error) exporter.DescriptorReference {
return &descriptorReference{
desc: desc,
+1
View File
@@ -51,6 +51,7 @@ var (
OptKeyOCITypes ImageExporterOptKey = "oci-mediatypes"
// Use OCI artifact format for the attestation manifest.
// Value: bool <true|false>
OptKeyOCIArtifact ImageExporterOptKey = "oci-artifact"
// Force attestation to be attached.
+23 -34
View File
@@ -7,7 +7,6 @@ import (
cacheconfig "github.com/moby/buildkit/cache/config"
"github.com/moby/buildkit/exporter/containerimage/exptypes"
"github.com/moby/buildkit/exporter/util/epoch"
"github.com/moby/buildkit/util/bklog"
"github.com/moby/buildkit/util/compression"
"github.com/pkg/errors"
)
@@ -15,7 +14,7 @@ import (
type ImageCommitOpts struct {
ImageName string
RefCfg cacheconfig.RefConfig
OCITypes bool
OCITypes *bool
OCIArtifact bool
Annotations AnnotationsGroup
Epoch *epoch.Epoch
@@ -48,7 +47,9 @@ func (c *ImageCommitOpts) Load(ctx context.Context, opt map[string]string) (map[
case exptypes.OptKeyName:
c.ImageName = v
case exptypes.OptKeyOCITypes:
err = parseBoolWithDefault(&c.OCITypes, k, v, true)
var b bool
err = parseBool(&b, k, v)
c.OCITypes = &b
case exptypes.OptKeyOCIArtifact:
err = parseBool(&c.OCIArtifact, k, v)
case exptypes.OptKeyForceInlineAttestations:
@@ -66,11 +67,8 @@ func (c *ImageCommitOpts) Load(ctx context.Context, opt map[string]string) (map[
}
}
if c.RefCfg.Compression.Type.OnlySupportOCITypes() {
c.EnableOCITypes(ctx, c.RefCfg.Compression.Type.String())
}
if c.OCIArtifact && !c.OCITypes {
c.EnableOCITypes(ctx, "oci-artifact")
if err := c.Validate(); err != nil {
return nil, err
}
c.Annotations = c.Annotations.Merge(as)
@@ -78,28 +76,27 @@ func (c *ImageCommitOpts) Load(ctx context.Context, opt map[string]string) (map[
return rest, nil
}
func (c *ImageCommitOpts) EnableOCITypes(ctx context.Context, reason string) {
if !c.OCITypes {
message := "forcibly turning on oci-mediatype mode"
if reason != "" {
message += " for " + reason
}
bklog.G(ctx).Warn(message)
func (c *ImageCommitOpts) Validate() error {
if c.OCITypes == nil {
return nil
}
if c.RefCfg.Compression.Type.OnlySupportOCITypes() && !c.OCITypesEnabled() {
return errors.Errorf("exporter option \"compression=%s\" conflicts with \"oci-mediatypes=false\"", c.RefCfg.Compression.Type)
}
if c.OCIArtifact && !c.OCITypesEnabled() {
return errors.New("exporter option \"oci-artifact=true\" conflicts with \"oci-mediatypes=false\"")
}
return nil
}
c.OCITypes = true
func (c *ImageCommitOpts) SetOCITypesDefault(v bool) {
if c.OCITypes == nil {
c.OCITypes = &v
}
}
func (c *ImageCommitOpts) EnableForceCompression(ctx context.Context, reason string) {
if !c.RefCfg.Compression.Force {
message := "forcibly turning on force-compression mode"
if reason != "" {
message += " for " + reason
}
bklog.G(ctx).Warn(message)
c.RefCfg.Compression.Force = true
}
func (c *ImageCommitOpts) OCITypesEnabled() bool {
return c.OCITypes != nil && *c.OCITypes
}
func parseBool(dest *bool, key string, value string) error {
@@ -111,14 +108,6 @@ func parseBool(dest *bool, key string, value string) error {
return nil
}
func parseBoolWithDefault(dest *bool, key string, value string, defaultValue bool) error {
if value == "" {
*dest = defaultValue
return nil
}
return parseBool(dest, key, value)
}
func toBytesMap(m map[string]string) map[string][]byte {
result := make(map[string][]byte)
for k, v := range m {
+1 -1
View File
@@ -12,6 +12,6 @@ import (
)
func patchImageLayers(ctx context.Context, remote *solver.Remote, history []ocispecs.History, ref cache.ImmutableRef, opts *ImageCommitOpts, _ session.Group) (*solver.Remote, []ocispecs.History, error) {
remote, history = normalizeLayersAndHistory(ctx, remote, history, ref, opts.OCITypes)
remote, history = normalizeLayersAndHistory(ctx, remote, history, ref, opts.OCITypesEnabled())
return remote, history, nil
}
+2 -2
View File
@@ -19,7 +19,7 @@ import (
// metadata of filesystem view for the entire image.
func patchImageLayers(ctx context.Context, remote *solver.Remote, history []ocispecs.History, ref cache.ImmutableRef, opts *ImageCommitOpts, sg session.Group) (*solver.Remote, []ocispecs.History, error) {
if opts.RefCfg.Compression.Type != compression.Nydus {
remote, history = normalizeLayersAndHistory(ctx, remote, history, ref, opts.OCITypes)
remote, history = normalizeLayersAndHistory(ctx, remote, history, ref, opts.OCITypesEnabled())
return remote, history, nil
}
@@ -29,6 +29,6 @@ func patchImageLayers(ctx context.Context, remote *solver.Remote, history []ocis
}
remote.Descriptors = append(remote.Descriptors, *desc)
remote, history = normalizeLayersAndHistory(ctx, remote, history, ref, opts.OCITypes)
remote, history = normalizeLayersAndHistory(ctx, remote, history, ref, opts.OCITypesEnabled())
return remote, history, nil
}
+13 -10
View File
@@ -69,6 +69,9 @@ func (ic *ImageWriter) Commit(ctx context.Context, inp *exporter.Source, session
if _, ok := inp.Metadata[exptypes.ExporterPlatformsKey]; len(inp.Refs) > 0 && !ok {
return nil, errors.Errorf("unable to export multiple refs, missing platforms mapping")
}
if err := opts.Validate(); err != nil {
return nil, err
}
if compatibilityVersion == compat.CompatibilityVersion013 && opts.RefCfg.Compression.Type == compression.Zstd {
feature := fmt.Sprintf("%s exporter compression=%s", exporterType, opts.RefCfg.Compression.Type.String())
return nil, solvererrdefs.NewUnsupportedCompatibilityFeatureError(compatibilityVersion, feature)
@@ -113,14 +116,14 @@ func (ic *ImageWriter) Commit(ctx context.Context, inp *exporter.Source, session
return nil, errors.Errorf("invalid annotation: no platform %s found in source", pk)
}
}
if len(a.Index)+len(a.IndexDescriptor)+len(a.ManifestDescriptor) > 0 {
opts.EnableOCITypes(ctx, "annotations")
if !opts.OCITypesEnabled() && len(a.Index)+len(a.IndexDescriptor)+len(a.ManifestDescriptor) > 0 {
return nil, errors.New("cannot export annotations with \"oci-mediatypes=false\"")
}
}
if !isMap {
if len(ps.Platforms) > 1 {
return nil, errors.Errorf("cannot export multiple platforms without multi-platform enabled")
return nil, errors.New("cannot export multiple platforms without multi-platform enabled")
}
var ref cache.ImmutableRef
@@ -201,8 +204,8 @@ func (ic *ImageWriter) Commit(ctx context.Context, inp *exporter.Source, session
return mfstDesc, nil
}
if len(inp.Attestations) > 0 {
opts.EnableOCITypes(ctx, "attestations")
if !opts.OCITypesEnabled() && len(inp.Attestations) > 0 {
return nil, errors.New("cannot export attestations with \"oci-mediatypes=false\"")
}
refs := make([]cache.ImmutableRef, 0, len(inp.Refs))
@@ -237,7 +240,7 @@ func (ic *ImageWriter) Commit(ctx context.Context, inp *exporter.Source, session
},
}
if !opts.OCITypes {
if !opts.OCITypesEnabled() {
idx.MediaType = images.MediaTypeDockerSchema2ManifestList
}
@@ -514,7 +517,7 @@ func (ic *ImageWriter) commitDistributionManifest(ctx context.Context, opts *Ima
)
// Use docker media types for older Docker versions and registries
if !opts.OCITypes {
if !opts.OCITypesEnabled() {
manifestType = images.MediaTypeDockerSchema2Manifest
configType = images.MediaTypeDockerSchema2Config
}
@@ -537,7 +540,7 @@ func (ic *ImageWriter) commitDistributionManifest(ctx context.Context, opts *Ima
}
for i, desc := range remote.Descriptors {
desc.Annotations = RemoveInternalLayerAnnotations(desc.Annotations, opts.OCITypes)
desc.Annotations = RemoveInternalLayerAnnotations(desc.Annotations, opts.OCITypesEnabled())
mfst.Layers = append(mfst.Layers, desc)
labels[fmt.Sprintf("containerd.io/gc.ref.content.%d", i+1)] = desc.Digest.String()
}
@@ -584,7 +587,7 @@ func (ic *ImageWriter) commitAttestationsManifest(ctx context.Context, opts *Ima
manifestType = ocispecs.MediaTypeImageManifest
configType = ocispecs.MediaTypeImageConfig
)
if !opts.OCITypes {
if !opts.OCITypesEnabled() {
manifestType = images.MediaTypeDockerSchema2Manifest
configType = images.MediaTypeDockerSchema2Config
}
@@ -650,7 +653,7 @@ func (ic *ImageWriter) commitAttestationsManifest(ctx context.Context, opts *Ima
"containerd.io/gc.ref.content.0": configDesc.Digest.String(),
}
for i, desc := range layers {
desc.Annotations = RemoveInternalLayerAnnotations(desc.Annotations, opts.OCITypes)
desc.Annotations = RemoveInternalLayerAnnotations(desc.Annotations, opts.OCITypesEnabled())
mfst.Layers = append(mfst.Layers, desc)
labels[fmt.Sprintf("containerd.io/gc.ref.content.%d", i+1)] = desc.Digest.String()
}
+2 -1
View File
@@ -61,6 +61,7 @@ func New(opt Opt) (exporter.Exporter, error) {
}
func (e *imageExporter) Resolve(ctx context.Context, id int, opt map[string]string) (exporter.ExporterInstance, error) {
ociTypes := e.opt.Variant == VariantOCI
i := &imageExporterInstance{
imageExporter: e,
id: id,
@@ -70,7 +71,7 @@ func (e *imageExporter) Resolve(ctx context.Context, id int, opt map[string]stri
RefCfg: cacheconfig.RefConfig{
Compression: compression.New(compression.Default),
},
OCITypes: e.opt.Variant == VariantOCI,
OCITypes: &ociTypes,
},
}
+3 -1
View File
@@ -9,7 +9,8 @@ import (
const (
CompatibilityVersion013 = 10
CompatibilityVersion015 = 20
CompatibilityVersionCurrent = CompatibilityVersion015
CompatibilityVersion031 = 30
CompatibilityVersionCurrent = CompatibilityVersion031
)
// JobValueKey is the key used to store the compatibility version on a solver
@@ -19,6 +20,7 @@ const JobValueKey = "llb.compatibilityversion"
var supportedCompatibilityVersions = []int{
CompatibilityVersion013,
CompatibilityVersion015,
CompatibilityVersion031,
}
func SupportedCompatibilityVersions() []int {
+3 -3
View File
@@ -7,13 +7,13 @@ import (
)
func TestSupportedCompatibilityVersions(t *testing.T) {
require.Equal(t, []int{10, 20}, SupportedCompatibilityVersions())
require.Equal(t, 20, CompatibilityVersionCurrent)
require.Equal(t, []int{10, 20, 30}, SupportedCompatibilityVersions())
require.Equal(t, 30, CompatibilityVersionCurrent)
}
func TestValidateCompatibilityVersion(t *testing.T) {
require.NoError(t, ValidateCompatibilityVersion(CompatibilityVersion013))
require.NoError(t, ValidateCompatibilityVersion(CompatibilityVersionCurrent))
require.ErrorContains(t, ValidateCompatibilityVersion(11), "unsupported compatibility-version 11")
require.ErrorContains(t, ValidateCompatibilityVersion(30), "upgrade buildkit")
require.ErrorContains(t, ValidateCompatibilityVersion(40), "upgrade buildkit")
}
+3 -7
View File
@@ -75,10 +75,6 @@ func (c Config) SetLevel(l int) Config {
return c
}
const (
mediaTypeDockerSchema2LayerZstd = images.MediaTypeDockerSchema2Layer + ".zstd"
)
var Default = Gzip
func parse(t string) (Type, error) {
@@ -191,8 +187,8 @@ var toDockerLayerType = map[string]string{
images.MediaTypeDockerSchema2LayerForeignGzip: images.MediaTypeDockerSchema2LayerForeignGzip,
ocispecs.MediaTypeImageLayerNonDistributable: images.MediaTypeDockerSchema2LayerForeign, //nolint:staticcheck // ignore SA1019: Non-distributable layers are deprecated, and not recommended for future use.
ocispecs.MediaTypeImageLayerNonDistributableGzip: images.MediaTypeDockerSchema2LayerForeignGzip, //nolint:staticcheck // ignore SA1019: Non-distributable layers are deprecated, and not recommended for future use.
ocispecs.MediaTypeImageLayerZstd: mediaTypeDockerSchema2LayerZstd,
mediaTypeDockerSchema2LayerZstd: mediaTypeDockerSchema2LayerZstd,
ocispecs.MediaTypeImageLayerZstd: images.MediaTypeDockerSchema2LayerZstd,
images.MediaTypeDockerSchema2LayerZstd: images.MediaTypeDockerSchema2LayerZstd,
}
var toOCILayerType = map[string]string{
@@ -206,7 +202,7 @@ var toOCILayerType = map[string]string{
images.MediaTypeDockerSchema2LayerForeign: ocispecs.MediaTypeImageLayerNonDistributable, //nolint:staticcheck // ignore SA1019: Non-distributable layers are deprecated, and not recommended for future use.
images.MediaTypeDockerSchema2LayerForeignGzip: ocispecs.MediaTypeImageLayerNonDistributableGzip, //nolint:staticcheck // ignore SA1019: Non-distributable layers are deprecated, and not recommended for future use.
ocispecs.MediaTypeImageLayerZstd: ocispecs.MediaTypeImageLayerZstd,
mediaTypeDockerSchema2LayerZstd: ocispecs.MediaTypeImageLayerZstd,
images.MediaTypeDockerSchema2LayerZstd: ocispecs.MediaTypeImageLayerZstd,
}
func convertLayerMediaType(ctx context.Context, mediaType string, oci bool) string {
+1 -1
View File
@@ -39,7 +39,7 @@ type winApplier struct {
func (s *winApplier) Apply(ctx context.Context, desc ocispecs.Descriptor, mounts []mount.Mount, opts ...diff.ApplyOpt) (d ocispecs.Descriptor, err error) {
// HACK:, containerd doesn't know about vnd.docker.image.rootfs.diff.tar.zstd, but that
// media type is compatible w/ the oci type, so just lie and say it's the oci type
if desc.MediaType == images.MediaTypeDockerSchema2Layer+".zstd" {
if desc.MediaType == images.MediaTypeDockerSchema2LayerZstd {
desc.MediaType = ocispecs.MediaTypeImageLayerZstd
}