github.com/pdmccormick/importable-docker-buildx@v0.0.0-20240426161518-e47091289030/cmd/buildx/buildxcmd/main.go (about) 1 package buildxcmd 2 3 import ( 4 "fmt" 5 "os" 6 7 "github.com/docker/buildx/commands" 8 "github.com/docker/buildx/util/desktop" 9 "github.com/docker/buildx/version" 10 "github.com/docker/cli/cli" 11 "github.com/docker/cli/cli-plugins/manager" 12 "github.com/docker/cli/cli-plugins/plugin" 13 "github.com/docker/cli/cli/command" 14 "github.com/docker/cli/cli/debug" 15 cliflags "github.com/docker/cli/cli/flags" 16 "github.com/moby/buildkit/solver/errdefs" 17 "github.com/moby/buildkit/util/stack" 18 19 //nolint:staticcheck // vendored dependencies may still use this 20 "github.com/containerd/containerd/pkg/seed" 21 22 _ "k8s.io/client-go/plugin/pkg/client/auth/oidc" 23 24 _ "github.com/docker/buildx/driver/docker" 25 _ "github.com/docker/buildx/driver/docker-container" 26 _ "github.com/docker/buildx/driver/kubernetes" 27 _ "github.com/docker/buildx/driver/remote" 28 ) 29 30 func init() { 31 //nolint:staticcheck 32 seed.WithTimeAndRand() 33 34 stack.SetVersionInfo(version.Version, version.Revision) 35 } 36 37 func runStandalone(cmd *command.DockerCli) error { 38 if err := cmd.Initialize(cliflags.NewClientOptions()); err != nil { 39 return err 40 } 41 rootCmd := commands.NewRootCmd(os.Args[0], false, cmd) 42 return rootCmd.Execute() 43 } 44 45 func runPlugin(cmd *command.DockerCli) error { 46 rootCmd := commands.NewRootCmd("buildx", true, cmd) 47 return plugin.RunPlugin(cmd, rootCmd, manager.Metadata{ 48 SchemaVersion: "0.1.0", 49 Vendor: "Docker Inc.", 50 Version: version.Version, 51 }) 52 } 53 54 func Main() { 55 cmd, err := command.NewDockerCli() 56 if err != nil { 57 fmt.Fprintln(os.Stderr, err) 58 os.Exit(1) 59 } 60 61 if plugin.RunningStandalone() { 62 err = runStandalone(cmd) 63 } else { 64 err = runPlugin(cmd) 65 } 66 if err == nil { 67 return 68 } 69 70 if sterr, ok := err.(cli.StatusError); ok { 71 if sterr.Status != "" { 72 fmt.Fprintln(cmd.Err(), sterr.Status) 73 } 74 // StatusError should only be used for errors, and all errors should 75 // have a non-zero exit status, so never exit with 0 76 if sterr.StatusCode == 0 { 77 os.Exit(1) 78 } 79 os.Exit(sterr.StatusCode) 80 } 81 82 for _, s := range errdefs.Sources(err) { 83 s.Print(cmd.Err()) 84 } 85 if debug.IsEnabled() { 86 fmt.Fprintf(cmd.Err(), "ERROR: %+v", stack.Formatter(err)) 87 } else { 88 fmt.Fprintf(cmd.Err(), "ERROR: %v\n", err) 89 } 90 if ebr, ok := err.(*desktop.ErrorWithBuildRef); ok { 91 ebr.Print(cmd.Err()) 92 } 93 94 os.Exit(1) 95 }