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  }