github.com/pdmccormick/importable-docker-buildx@v0.0.0-20240426161518-e47091289030/commands/use.go (about) 1 package commands 2 3 import ( 4 "os" 5 6 "github.com/docker/buildx/store/storeutil" 7 "github.com/docker/buildx/util/cobrautil/completion" 8 "github.com/docker/buildx/util/dockerutil" 9 "github.com/docker/cli/cli" 10 "github.com/docker/cli/cli/command" 11 "github.com/pkg/errors" 12 "github.com/spf13/cobra" 13 ) 14 15 type useOptions struct { 16 isGlobal bool 17 isDefault bool 18 builder string 19 } 20 21 func runUse(dockerCli command.Cli, in useOptions) error { 22 txn, release, err := storeutil.GetStore(dockerCli) 23 if err != nil { 24 return err 25 } 26 defer release() 27 28 if _, err := txn.NodeGroupByName(in.builder); err != nil { 29 if os.IsNotExist(errors.Cause(err)) { 30 if in.builder == "default" && in.builder != dockerCli.CurrentContext() { 31 return errors.Errorf("run `docker context use default` to switch to default context") 32 } 33 if in.builder == "default" || in.builder == dockerCli.CurrentContext() { 34 ep, err := dockerutil.GetCurrentEndpoint(dockerCli) 35 if err != nil { 36 return err 37 } 38 return txn.SetCurrent(ep, "", false, false) 39 } 40 list, err := dockerCli.ContextStore().List() 41 if err != nil { 42 return err 43 } 44 for _, l := range list { 45 if l.Name == in.builder { 46 return errors.Errorf("run `docker context use %s` to switch to context %s", in.builder, in.builder) 47 } 48 } 49 50 } 51 return errors.Wrapf(err, "failed to find instance %q", in.builder) 52 } 53 54 ep, err := dockerutil.GetCurrentEndpoint(dockerCli) 55 if err != nil { 56 return err 57 } 58 return txn.SetCurrent(ep, in.builder, in.isGlobal, in.isDefault) 59 } 60 61 func useCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command { 62 var options useOptions 63 64 cmd := &cobra.Command{ 65 Use: "use [OPTIONS] NAME", 66 Short: "Set the current builder instance", 67 Args: cli.RequiresMaxArgs(1), 68 RunE: func(cmd *cobra.Command, args []string) error { 69 options.builder = rootOpts.builder 70 if len(args) > 0 { 71 options.builder = args[0] 72 } 73 return runUse(dockerCli, options) 74 }, 75 ValidArgsFunction: completion.BuilderNames(dockerCli), 76 } 77 78 flags := cmd.Flags() 79 flags.BoolVar(&options.isGlobal, "global", false, "Builder persists context changes") 80 flags.BoolVar(&options.isDefault, "default", false, "Set builder as default for current context") 81 82 return cmd 83 }