Merge pull request #1813 from jedevc/oci-export-on-containerd

pull/1870/head v0.11.0-rc2
Justin Chadwell 2 years ago committed by GitHub
commit 47e34f2684
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -364,7 +364,7 @@ func toRepoOnly(in string) (string, error) {
return strings.Join(out, ","), nil return strings.Join(out, ","), nil
} }
func toSolveOpt(ctx context.Context, node builder.Node, multiDriver bool, opt Options, bopts gateway.BuildOpts, configDir string, pw progress.Writer, dl dockerLoadCallback) (solveOpt *client.SolveOpt, release func(), err error) { func toSolveOpt(ctx context.Context, node builder.Node, multiDriver bool, opt Options, bopts gateway.BuildOpts, configDir string, pw progress.Writer, docker *dockerutil.Client) (solveOpt *client.SolveOpt, release func(), err error) {
nodeDriver := node.Driver nodeDriver := node.Driver
defers := make([]func(), 0, 2) defers := make([]func(), 0, 2)
releaseF := func() { releaseF := func() {
@ -532,14 +532,22 @@ func toSolveOpt(ctx context.Context, node builder.Node, multiDriver bool, opt Op
return nil, nil, notSupported(nodeDriver, driver.OCIExporter) return nil, nil, notSupported(nodeDriver, driver.OCIExporter)
} }
if e.Type == "docker" { if e.Type == "docker" {
if len(opt.Platforms) > 1 || len(attests) > 0 { features := docker.Features(ctx, e.Attrs["context"])
if features[dockerutil.OCIImporter] && e.Output == nil {
// rely on oci importer if available (which supports
// multi-platform images), otherwise fall back to docker
opt.Exports[i].Type = "oci"
} else if len(opt.Platforms) > 1 || len(attests) > 0 {
if e.Output != nil {
return nil, nil, errors.Errorf("docker exporter does not support exporting manifest lists, use the oci exporter instead")
}
return nil, nil, errors.Errorf("docker exporter does not currently support exporting manifest lists") return nil, nil, errors.Errorf("docker exporter does not currently support exporting manifest lists")
} }
if e.Output == nil { if e.Output == nil {
if nodeDriver.IsMobyDriver() { if nodeDriver.IsMobyDriver() {
e.Type = "image" e.Type = "image"
} else { } else {
w, cancel, err := dl(e.Attrs["context"]) w, cancel, err := docker.LoadImage(ctx, e.Attrs["context"], pw)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
@ -734,9 +742,7 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s
hasMobyDriver = true hasMobyDriver = true
} }
opt.Platforms = np.platforms opt.Platforms = np.platforms
so, release, err := toSolveOpt(ctx, node, multiDriver, opt, np.bopts, configDir, w, func(name string) (io.WriteCloser, func(), error) { so, release, err := toSolveOpt(ctx, node, multiDriver, opt, np.bopts, configDir, w, docker)
return docker.LoadImage(ctx, name, w)
})
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -1555,8 +1561,6 @@ func notSupported(d driver.Driver, f driver.Feature) error {
return errors.Errorf("%s feature is currently not supported for %s driver. Please switch to a different driver (eg. \"docker buildx create --use\")", f, d.Factory().Name()) return errors.Errorf("%s feature is currently not supported for %s driver. Please switch to a different driver (eg. \"docker buildx create --use\")", f, d.Factory().Name())
} }
type dockerLoadCallback func(name string) (io.WriteCloser, func(), error)
func noDefaultLoad() bool { func noDefaultLoad() bool {
v, ok := os.LookupEnv("BUILDX_NO_DEFAULT_LOAD") v, ok := os.LookupEnv("BUILDX_NO_DEFAULT_LOAD")
if !ok { if !ok {

@ -63,6 +63,23 @@ func (c *Client) LoadImage(ctx context.Context, name string, status progress.Wri
}, nil }, nil
} }
func (c *Client) Features(ctx context.Context, name string) map[Feature]bool {
features := make(map[Feature]bool)
if dapi, err := c.API(name); err == nil {
if info, err := dapi.Info(ctx); err == nil {
for _, v := range info.DriverStatus {
switch v[0] {
case "driver-type":
if v[1] == "io.containerd.snapshotter.v1" {
features[OCIImporter] = true
}
}
}
}
}
return features
}
type waitingWriter struct { type waitingWriter struct {
*io.PipeWriter *io.PipeWriter
f func() f func()

@ -0,0 +1,5 @@
package dockerutil
type Feature string
const OCIImporter Feature = "OCI importer"
Loading…
Cancel
Save