Bläddra i källkod

Improve buildkit node creation (#10843)

Move builder and nodes initialization code up, avoiding to recreate/load them for every service build.

Signed-off-by: Silvin Lubecki <[email protected]>
Silvin Lubecki 2 år sedan
förälder
incheckning
7c42776770
2 ändrade filer med 28 tillägg och 13 borttagningar
  1. 23 1
      pkg/compose/build.go
  2. 5 12
      pkg/compose/build_buildkit.go

+ 23 - 1
pkg/compose/build.go

@@ -22,6 +22,7 @@ import (
 	"os"
 	"path/filepath"
 
+	"github.com/docker/buildx/builder"
 	"github.com/docker/compose/v2/internal/tracing"
 
 	"github.com/docker/buildx/controller/pb"
@@ -68,6 +69,27 @@ func (s *composeService) build(ctx context.Context, project *types.Project, opti
 		return nil, err
 	}
 
+	// Initialize buildkit nodes
+	var (
+		b     *builder.Builder
+		nodes []builder.Node
+	)
+	if buildkitEnabled {
+		builderName := options.Builder
+		if builderName == "" {
+			builderName = os.Getenv("BUILDX_BUILDER")
+		}
+		b, err = builder.New(s.dockerCli, builder.WithName(builderName))
+		if err != nil {
+			return nil, err
+		}
+
+		nodes, err = b.LoadNodes(ctx, false)
+		if err != nil {
+			return nil, err
+		}
+	}
+
 	// Progress needs its own context that lives longer than the
 	// build one otherwise it won't read all the messages from
 	// build and will lock
@@ -118,7 +140,7 @@ func (s *composeService) build(ctx context.Context, project *types.Project, opti
 		}
 		buildOptions.BuildArgs = mergeArgs(buildOptions.BuildArgs, flatten(args))
 
-		digest, err := s.doBuildBuildkit(ctx, service.Name, buildOptions, w, options.Builder)
+		digest, err := s.doBuildBuildkit(ctx, service.Name, buildOptions, w, nodes)
 		if err != nil {
 			return err
 		}

+ 5 - 12
pkg/compose/build_buildkit.go

@@ -34,18 +34,11 @@ import (
 	"github.com/moby/buildkit/client"
 )
 
-func (s *composeService) doBuildBuildkit(ctx context.Context, service string, opts build.Options, p *buildx.Printer, builderName string) (string, error) {
-	b, err := builder.New(s.dockerCli, builder.WithName(builderName))
-	if err != nil {
-		return "", err
-	}
-
-	nodes, err := b.LoadNodes(ctx, false)
-	if err != nil {
-		return "", err
-	}
-
-	var response map[string]*client.SolveResponse
+func (s *composeService) doBuildBuildkit(ctx context.Context, service string, opts build.Options, p *buildx.Printer, nodes []builder.Node) (string, error) {
+	var (
+		response map[string]*client.SolveResponse
+		err      error
+	)
 	if s.dryRun {
 		response = s.dryRunBuildResponse(ctx, service, opts)
 	} else {