From 5d50bd7b43b4e679b57f7a9ec0897dcd2e3d91e1 Mon Sep 17 00:00:00 2001 From: CrazyMax Date: Thu, 12 Aug 2021 08:45:40 +0200 Subject: [PATCH] Allow booting builder after creation Signed-off-by: CrazyMax --- commands/create.go | 19 +++++++++++ commands/inspect.go | 59 +-------------------------------- commands/util.go | 54 ++++++++++++++++++++++++++++++ docs/reference/buildx_create.md | 1 + 4 files changed, 75 insertions(+), 58 deletions(-) diff --git a/commands/create.go b/commands/create.go index 553fee71134..f7a205ed6ea 100644 --- a/commands/create.go +++ b/commands/create.go @@ -1,11 +1,13 @@ package commands import ( + "context" "encoding/csv" "fmt" "net/url" "os" "strings" + "time" "github.com/docker/buildx/driver" "github.com/docker/buildx/store" @@ -29,6 +31,7 @@ type createOptions struct { flags string configFile string driverOpts []string + bootstrap bool // upgrade bool // perform upgrade of the driver } @@ -179,6 +182,21 @@ func runCreate(dockerCli command.Cli, in createOptions, args []string) error { } } + ngi := &nginfo{ng: ng} + + timeoutCtx, cancel := context.WithTimeout(ctx, 20*time.Second) + defer cancel() + + if err = loadNodeGroupData(timeoutCtx, dockerCli, ngi); err != nil { + return err + } + + if in.bootstrap { + if _, err = boot(ctx, ngi); err != nil { + return err + } + } + fmt.Printf("%s\n", ng.Name) return nil } @@ -209,6 +227,7 @@ func createCmd(dockerCli command.Cli) *cobra.Command { flags.StringVar(&options.configFile, "config", "", "BuildKit config file") flags.StringArrayVar(&options.platform, "platform", []string{}, "Fixed platforms for current node") flags.StringArrayVar(&options.driverOpts, "driver-opt", []string{}, "Options for the driver") + flags.BoolVar(&options.bootstrap, "bootstrap", false, "Boot builder after creation") flags.BoolVar(&options.actionAppend, "append", false, "Append a node to builder instead of changing it") flags.BoolVar(&options.actionLeave, "leave", false, "Remove a node from builder instead of changing it") diff --git a/commands/inspect.go b/commands/inspect.go index fb9d95355a8..902750a6610 100644 --- a/commands/inspect.go +++ b/commands/inspect.go @@ -8,17 +8,12 @@ import ( "text/tabwriter" "time" - "github.com/docker/buildx/build" - "github.com/docker/buildx/driver" "github.com/docker/buildx/store" "github.com/docker/buildx/util/platformutil" - "github.com/docker/buildx/util/progress" "github.com/docker/cli/cli" "github.com/docker/cli/cli/command" "github.com/moby/buildkit/util/appcontext" - specs "github.com/opencontainers/image-spec/specs-go/v1" "github.com/spf13/cobra" - "golang.org/x/sync/errgroup" ) type inspectOptions struct { @@ -26,19 +21,6 @@ type inspectOptions struct { builder string } -type dinfo struct { - di *build.DriverInfo - info *driver.Info - platforms []specs.Platform - err error -} - -type nginfo struct { - ng *store.NodeGroup - drivers []dinfo - err error -} - func runInspect(dockerCli command.Cli, in inspectOptions) error { ctx := appcontext.Context() @@ -82,7 +64,7 @@ func runInspect(dockerCli command.Cli, in inspectOptions) error { var bootNgi *nginfo if in.bootstrap { var ok bool - ok, err = boot(ctx, ngi, dockerCli) + ok, err = boot(ctx, ngi) if err != nil { return err } @@ -156,42 +138,3 @@ func inspectCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command { return cmd } - -func boot(ctx context.Context, ngi *nginfo, dockerCli command.Cli) (bool, error) { - toBoot := make([]int, 0, len(ngi.drivers)) - for i, d := range ngi.drivers { - if d.err != nil || d.di.Err != nil || d.di.Driver == nil || d.info == nil { - continue - } - if d.info.Status != driver.Running { - toBoot = append(toBoot, i) - } - } - if len(toBoot) == 0 { - return false, nil - } - - printer := progress.NewPrinter(context.TODO(), os.Stderr, "auto") - - eg, _ := errgroup.WithContext(ctx) - for _, idx := range toBoot { - func(idx int) { - eg.Go(func() error { - pw := progress.WithPrefix(printer, ngi.ng.Nodes[idx].Name, len(toBoot) > 1) - _, err := driver.Boot(ctx, ngi.drivers[idx].di.Driver, pw) - if err != nil { - ngi.drivers[idx].err = err - } - return nil - }) - }(idx) - } - - err := eg.Wait() - err1 := printer.Wait() - if err == nil { - err = err1 - } - - return true, err -} diff --git a/commands/util.go b/commands/util.go index 23ea37e2716..a279c659977 100644 --- a/commands/util.go +++ b/commands/util.go @@ -11,12 +11,14 @@ import ( "github.com/docker/buildx/driver" "github.com/docker/buildx/store" "github.com/docker/buildx/util/platformutil" + "github.com/docker/buildx/util/progress" "github.com/docker/cli/cli/command" "github.com/docker/cli/cli/context/docker" "github.com/docker/cli/cli/context/kubernetes" ctxstore "github.com/docker/cli/cli/context/store" dopts "github.com/docker/cli/opts" dockerclient "github.com/docker/docker/client" + specs "github.com/opencontainers/image-spec/specs-go/v1" "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/sync/errgroup" @@ -475,3 +477,55 @@ func (a *api) DockerAPI(name string) (dockerclient.APIClient, error) { } return clientForEndpoint(a.dockerCli, name) } + +type dinfo struct { + di *build.DriverInfo + info *driver.Info + platforms []specs.Platform + err error +} + +type nginfo struct { + ng *store.NodeGroup + drivers []dinfo + err error +} + +func boot(ctx context.Context, ngi *nginfo) (bool, error) { + toBoot := make([]int, 0, len(ngi.drivers)) + for i, d := range ngi.drivers { + if d.err != nil || d.di.Err != nil || d.di.Driver == nil || d.info == nil { + continue + } + if d.info.Status != driver.Running { + toBoot = append(toBoot, i) + } + } + if len(toBoot) == 0 { + return false, nil + } + + printer := progress.NewPrinter(context.TODO(), os.Stderr, "auto") + + eg, _ := errgroup.WithContext(ctx) + for _, idx := range toBoot { + func(idx int) { + eg.Go(func() error { + pw := progress.WithPrefix(printer, ngi.ng.Nodes[idx].Name, len(toBoot) > 1) + _, err := driver.Boot(ctx, ngi.drivers[idx].di.Driver, pw) + if err != nil { + ngi.drivers[idx].err = err + } + return nil + }) + }(idx) + } + + err := eg.Wait() + err1 := printer.Wait() + if err == nil { + err = err1 + } + + return true, err +} diff --git a/docs/reference/buildx_create.md b/docs/reference/buildx_create.md index 743d95de64e..947b59f700c 100644 --- a/docs/reference/buildx_create.md +++ b/docs/reference/buildx_create.md @@ -12,6 +12,7 @@ Create a new builder instance | Name | Description | | --- | --- | | [`--append`](#append) | Append a node to builder instead of changing it | +| `--bootstrap` | Boot builder after creation | | `--builder string` | Override the configured builder instance | | [`--buildkitd-flags string`](#buildkitd-flags) | Flags for buildkitd daemon | | [`--config string`](#config) | BuildKit config file |