From 5a26b257099844f46fdc53b3b94e399032027e1c Mon Sep 17 00:00:00 2001 From: aiordache Date: Wed, 29 Jul 2020 11:58:09 +0200 Subject: [PATCH] handle compose on all context types Signed-off-by: aiordache --- cli/cmd/compose/compose.go | 21 +++++++++++++++++++++ cli/main.go | 6 +++--- cli/mobycli/exec.go | 7 ------- context/store/store.go | 3 +++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/cli/cmd/compose/compose.go b/cli/cmd/compose/compose.go index 6b2747284..b8c9ea677 100644 --- a/cli/cmd/compose/compose.go +++ b/cli/cmd/compose/compose.go @@ -17,6 +17,11 @@ package compose import ( + apicontext "github.com/docker/api/context" + "github.com/docker/api/context/store" + "github.com/docker/api/errdefs" + "github.com/pkg/errors" + "github.com/spf13/cobra" ) @@ -25,6 +30,22 @@ func Command() *cobra.Command { command := &cobra.Command{ Short: "Docker Compose", Use: "compose", + PersistentPreRunE: func(cmd *cobra.Command, args []string) error { + currentContext := apicontext.CurrentContext(cmd.Context()) + s := store.ContextStore(cmd.Context()) + cc, err := s.Get(currentContext) + if err != nil { + return err + } + switch cc.Type() { + case store.AciContextType: + return nil + case store.AwsContextType: + return errors.New("use 'docker ecs compose' on context type " + cc.Type()) + default: + return errors.Wrapf(errdefs.ErrNotImplemented, "compose command not supported on context type %q", cc.Type()) + } + }, } command.AddCommand( diff --git a/cli/main.go b/cli/main.go index 03a73698b..b61622dac 100644 --- a/cli/main.go +++ b/cli/main.go @@ -59,6 +59,7 @@ var ( var ( ownCommands = map[string]struct{}{ + "compose": {}, "context": {}, "login": {}, "logout": {}, @@ -181,7 +182,6 @@ func main() { if errors.Is(ctx.Err(), context.Canceled) { os.Exit(130) } - // Context should always be handled by new CLI requiredCmd, _, _ := root.Find(os.Args[1:]) if requiredCmd != nil && isOwnCommand(requiredCmd) { @@ -196,7 +196,7 @@ func main() { func exit(err error) { if errors.Is(err, errdefs.ErrLoginRequired) { - fmt.Fprintln(os.Stderr, fmt.Errorf("%v", err)) + fmt.Fprintln(os.Stderr, err) os.Exit(errdefs.ExitCodeLoginRequired) } fatal(err) @@ -242,6 +242,6 @@ func determineCurrentContext(flag string, configDir string) string { } func fatal(err error) { - fmt.Fprint(os.Stderr, err) + fmt.Fprintln(os.Stderr, err) os.Exit(1) } diff --git a/cli/mobycli/exec.go b/cli/mobycli/exec.go index 33ce71409..ec4c89ec9 100644 --- a/cli/mobycli/exec.go +++ b/cli/mobycli/exec.go @@ -18,7 +18,6 @@ package mobycli import ( "context" - "errors" "fmt" "os" "os/exec" @@ -52,12 +51,6 @@ func mustDelegateToMoby(ctxType string) bool { // Exec delegates to com.docker.cli if on moby context func Exec(ctx context.Context) { - if os.Args[1] == "compose" { - // command is not implemented for moby or aws context - fmt.Fprintln(os.Stderr, errors.New("'compose' command is not implemented for the context in use")) - os.Exit(1) - } - cmd := exec.CommandContext(ctx, ComDockerCli, os.Args[1:]...) cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout diff --git a/context/store/store.go b/context/store/store.go index 88bca079e..a91cb0bca 100644 --- a/context/store/store.go +++ b/context/store/store.go @@ -140,6 +140,9 @@ func New(opts ...Opt) (Store, error) { // Get returns the context with the given name func (s *store) Get(name string) (*DockerContext, error) { + if name == "default" { + return dockerDefaultContext() + } meta := filepath.Join(s.root, contextsDir, metadataDir, contextDirOf(name), metaFile) m, err := read(meta) if os.IsNotExist(err) {