@@ -363,7 +363,7 @@ func toRepoOnly(in string) (string, error) {
363363 return strings .Join (out , "," ), nil
364364}
365365
366- 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 ) {
366+ 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 ) {
367367 nodeDriver := node .Driver
368368 defers := make ([]func (), 0 , 2 )
369369 releaseF := func () {
@@ -531,14 +531,22 @@ func toSolveOpt(ctx context.Context, node builder.Node, multiDriver bool, opt Op
531531 return nil , nil , notSupported (nodeDriver , driver .OCIExporter )
532532 }
533533 if e .Type == "docker" {
534- if len (opt .Platforms ) > 1 || len (attests ) > 0 {
534+ features , err := docker .Features (ctx , e .Attrs ["context" ])
535+ if err != nil {
536+ return nil , nil , err
537+ }
538+ if features [dockerutil .OCIImporter ] {
539+ // rely on oci importer if available (which supports
540+ // multi-platform images), otherwise fall back to docker
541+ opt .Exports [i ].Type = "oci"
542+ } else if len (opt .Platforms ) > 1 || len (attests ) > 0 {
535543 return nil , nil , errors .Errorf ("docker exporter does not currently support exporting manifest lists" )
536544 }
537545 if e .Output == nil {
538546 if nodeDriver .IsMobyDriver () {
539547 e .Type = "image"
540548 } else {
541- w , cancel , err := dl ( e .Attrs ["context" ])
549+ w , cancel , err := docker . LoadImage ( ctx , e .Attrs ["context" ], pw )
542550 if err != nil {
543551 return nil , nil , err
544552 }
@@ -733,9 +741,7 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s
733741 hasMobyDriver = true
734742 }
735743 opt .Platforms = np .platforms
736- so , release , err := toSolveOpt (ctx , node , multiDriver , opt , np .bopts , configDir , w , func (name string ) (io.WriteCloser , func (), error ) {
737- return docker .LoadImage (ctx , name , w )
738- })
744+ so , release , err := toSolveOpt (ctx , node , multiDriver , opt , np .bopts , configDir , w , docker )
739745 if err != nil {
740746 return nil , err
741747 }
@@ -1543,8 +1549,6 @@ func notSupported(d driver.Driver, f driver.Feature) error {
15431549 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 ())
15441550}
15451551
1546- type dockerLoadCallback func (name string ) (io.WriteCloser , func (), error )
1547-
15481552func noDefaultLoad () bool {
15491553 v , ok := os .LookupEnv ("BUILDX_NO_DEFAULT_LOAD" )
15501554 if ! ok {
0 commit comments