浏览代码

Fix bug where we shell out to Moby cli only if context == default. We must shell out to Moby cli for any context of type “Moby”, not only the default context.

Guillaume Tardif 5 年之前
父节点
当前提交
3981244701
共有 5 个文件被更改,包括 23 次插入18 次删除
  1. 3 2
      cli/mobycli/exec.go
  2. 1 1
      context/store/contextmetadata.go
  3. 11 12
      context/store/store.go
  4. 1 3
      context/store/storedefault.go
  5. 7 0
      tests/e2e/e2e_test.go

+ 3 - 2
cli/mobycli/exec.go

@@ -19,12 +19,13 @@ const ComDockerCli = "com.docker.cli"
 // Exec delegates to com.docker.cli if on moby context
 func Exec(ctx context.Context) {
 	currentContext := apicontext.CurrentContext(ctx)
+
 	s := store.ContextStore(ctx)
 
-	_, err := s.Get(currentContext)
+	currentCtx, err := s.Get(currentContext)
 	// Only run original docker command if the current context is not
 	// ours.
-	if err != nil {
+	if err != nil || currentCtx.Type() == store.DefaultContextType {
 		shellOut(ctx)
 	}
 }

+ 1 - 1
context/store/contextmetadata.go

@@ -12,7 +12,7 @@ type DockerContext struct {
 // Type the context type
 func (m *DockerContext) Type() string {
 	if m.Metadata.Type == "" {
-		return defaultContextType
+		return DefaultContextType
 	}
 	return m.Metadata.Type
 }

+ 11 - 12
context/store/store.go

@@ -45,6 +45,17 @@ import (
 const (
 	// DefaultContextName is an automatically generated local context
 	DefaultContextName = "default"
+	// DefaultContextType is the type for all moby contexts (not associated with cli backend)
+	DefaultContextType = "moby"
+	// AciContextType is the endpoint key in the context endpoints for an ACI
+	// backend
+	AciContextType = "aci"
+	// LocalContextType is the endpoint key in the context endpoints for a new
+	// local backend
+	LocalContextType = "local"
+	// ExampleContextType is the endpoint key in the context endpoints for an
+	// example backend
+	ExampleContextType = "example"
 )
 
 const (
@@ -92,18 +103,6 @@ type Endpoint struct {
 	DefaultNamespace string `json:",omitempty"`
 }
 
-const (
-	// AciContextType is the endpoint key in the context endpoints for an ACI
-	// backend
-	AciContextType = "aci"
-	// LocalContextType is the endpoint key in the context endpoints for a new
-	// local backend
-	LocalContextType = "local"
-	// ExampleContextType is the endpoint key in the context endpoints for an
-	// example backend
-	ExampleContextType = "example"
-)
-
 type store struct {
 	root string
 }

+ 1 - 3
context/store/storedefault.go

@@ -8,8 +8,6 @@ import (
 	"github.com/pkg/errors"
 )
 
-const defaultContextType = "moby"
-
 // Represents a context as created by the docker cli
 type defaultContext struct {
 	Metadata  ContextMetadata
@@ -67,7 +65,7 @@ func dockerDefaultContext() (*DockerContext, error) {
 			},
 		},
 		Metadata: ContextMetadata{
-			Type:              defaultContextType,
+			Type:              DefaultContextType,
 			Description:       "Current DOCKER_HOST based configuration",
 			StackOrchestrator: defaultCtx.Metadata.StackOrchestrator,
 		},

+ 7 - 0
tests/e2e/e2e_test.go

@@ -169,6 +169,13 @@ func (s *E2eSuite) TestLegacy() {
 		output := s.NewDockerCommand("run", "--rm", "hello-world").WithTimeout(time.NewTimer(20 * time.Second).C).ExecOrDie()
 		Expect(output).To(ContainSubstring("Hello from Docker!"))
 	})
+
+	It("should execute legacy commands in other moby contexts", func() {
+		s.NewDockerCommand("context", "create", "mobyCtx", "--from=default").ExecOrDie()
+		s.NewDockerCommand("context", "use", "mobyCtx").ExecOrDie()
+		output, _ := s.NewDockerCommand("swarm", "join").Exec()
+		Expect(output).To(ContainSubstring("\"docker swarm join\" requires exactly 1 argument."))
+	})
 }
 
 func (s *E2eSuite) TestLeaveLegacyErrorMessagesUnchanged() {