Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion build/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -525,7 +525,6 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opts map[
}
}
}

node := dp.Node().Driver
if node.IsMobyDriver() {
for _, e := range so.Exports {
Expand Down Expand Up @@ -561,6 +560,14 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opts map[
}
}
}
// if prefer-image-digest is set in the solver options, remove the image
// config digest from the exporter's response
for _, e := range so.Exports {
if e.Attrs["prefer-image-digest"] == "true" {
delete(rr.ExporterResponse, exptypes.ExporterImageConfigDigestKey)
break
}
}
return nil
})
}
Expand Down
5 changes: 5 additions & 0 deletions build/opt.go
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,11 @@ func toSolveOpt(ctx context.Context, node builder.Node, multiDriver bool, opt *O
opt.Exports[i].Output = func(_ map[string]string) (io.WriteCloser, error) {
return w, nil
}
// if docker is using the containerd snapshotter, prefer to export the image digest
// (rather than the image config digest). See https://github.com/moby/moby/issues/45458.
if features[dockerutil.OCIImporter] {
opt.Exports[i].Attrs["prefer-image-digest"] = "true"
}
}
} else if !nodeDriver.Features(ctx)[driver.DockerExporter] {
return nil, nil, notSupported(driver.DockerExporter, nodeDriver, "https://docs.docker.com/go/build-exporters/")
Expand Down
9 changes: 8 additions & 1 deletion tests/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -399,18 +399,25 @@ func testImageIDOutput(t *testing.T, sb integration.Sandbox) {

require.Equal(t, dgst.String(), strings.TrimSpace(stdout.String()))

// read the md.json file
dt, err = os.ReadFile(filepath.Join(targetDir, "md.json"))
require.NoError(t, err)

type mdT struct {
Digest string `json:"containerimage.digest"`
ConfigDigest string `json:"containerimage.config.digest"`
}

var md mdT
err = json.Unmarshal(dt, &md)
require.NoError(t, err)

require.NotEmpty(t, md.ConfigDigest)
require.Equal(t, dgst, digest.Digest(md.ConfigDigest))
require.NotEmpty(t, md.Digest)

// verify the image ID output is correct
// XXX: improve this by checking that it's one of the two expected digests depending on the scenario.
require.Contains(t, []digest.Digest{digest.Digest(md.ConfigDigest), digest.Digest(md.Digest)}, dgst)
}

func testBuildMobyFromLocalImage(t *testing.T, sb integration.Sandbox) {
Expand Down