瀏覽代碼

handle compose on all context types

Signed-off-by: aiordache <[email protected]>
aiordache 5 年之前
父節點
當前提交
5a26b25709
共有 4 個文件被更改,包括 27 次插入10 次删除
  1. 21 0
      cli/cmd/compose/compose.go
  2. 3 3
      cli/main.go
  3. 0 7
      cli/mobycli/exec.go
  4. 3 0
      context/store/store.go

+ 21 - 0
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(

+ 3 - 3
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)
 }

+ 0 - 7
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

+ 3 - 0
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) {