Browse Source

Support COMPOSE_IGNORE_ORPHANS for compose run

This revives #7020 and resolves the issue mentioned in #4992.

Signed-off-by: Zixuan James Li <[email protected]>
PIG208 3 years ago
parent
commit
bcaa908f74
3 changed files with 27 additions and 3 deletions
  1. 8 3
      cmd/compose/run.go
  2. 14 0
      pkg/e2e/compose_run_test.go
  3. 5 0
      pkg/e2e/fixtures/run-test/orphan.yaml

+ 8 - 3
cmd/compose/run.go

@@ -53,6 +53,7 @@ type runOptions struct {
 	servicePorts  bool
 	name          string
 	noDeps        bool
+	ignoreOrphans bool
 	quietPull     bool
 }
 
@@ -134,6 +135,8 @@ func runCommand(p *projectOptions, backend api.Service) *cobra.Command {
 			if err != nil {
 				return err
 			}
+			ignore := project.Environment["COMPOSE_IGNORE_ORPHANS"]
+			opts.ignoreOrphans = strings.ToLower(ignore) == "true"
 			return runRun(ctx, backend, project, opts)
 		}),
 		ValidArgsFunction: serviceCompletion(p),
@@ -182,7 +185,7 @@ func runRun(ctx context.Context, backend api.Service, project *types.Project, op
 	}
 
 	err = progress.Run(ctx, func(ctx context.Context) error {
-		return startDependencies(ctx, backend, *project, opts.Service)
+		return startDependencies(ctx, backend, *project, opts.Service, opts.ignoreOrphans)
 	})
 	if err != nil {
 		return err
@@ -229,7 +232,7 @@ func runRun(ctx context.Context, backend api.Service, project *types.Project, op
 	return err
 }
 
-func startDependencies(ctx context.Context, backend api.Service, project types.Project, requestedServiceName string) error {
+func startDependencies(ctx context.Context, backend api.Service, project types.Project, requestedServiceName string, ignoreOrphans bool) error {
 	dependencies := types.Services{}
 	var requestedService types.ServiceConfig
 	for _, service := range project.Services {
@@ -242,7 +245,9 @@ func startDependencies(ctx context.Context, backend api.Service, project types.P
 
 	project.Services = dependencies
 	project.DisabledServices = append(project.DisabledServices, requestedService)
-	if err := backend.Create(ctx, &project, api.CreateOptions{}); err != nil {
+	if err := backend.Create(ctx, &project, api.CreateOptions{
+		IgnoreOrphans: ignoreOrphans,
+	}); err != nil {
 		return err
 	}
 	return backend.Start(ctx, project.Name, api.StartOptions{})

+ 14 - 0
pkg/e2e/compose_run_test.go

@@ -98,8 +98,22 @@ func TestLocalComposeRun(t *testing.T) {
 		assert.Assert(t, strings.Contains(res.Stdout(), "8081->80/tcp"), res.Stdout())
 	})
 
+	t.Run("compose run orphan", func(t *testing.T) {
+		// Use different compose files to get an orphan container
+		c.RunDockerComposeCmd("-f", "./fixtures/run-test/orphan.yaml", "run", "simple")
+		res := c.RunDockerComposeCmd("-f", "./fixtures/run-test/compose.yaml", "run", "back", "echo", "Hello")
+		assert.Assert(t, strings.Contains(res.Combined(), "orphan"))
+
+		cmd := c.NewDockerCmd("compose", "-f", "./fixtures/run-test/compose.yaml", "run", "back", "echo", "Hello")
+		res = icmd.RunCmd(cmd, func(cmd *icmd.Cmd) {
+			cmd.Env = append(cmd.Env, "COMPOSE_IGNORE_ORPHANS=True")
+		})
+		assert.Assert(t, !strings.Contains(res.Combined(), "orphan"))
+	})
+
 	t.Run("down", func(t *testing.T) {
 		c.RunDockerComposeCmd("-f", "./fixtures/run-test/compose.yaml", "down")
+		c.RunDockerComposeCmd("-f", "./fixtures/run-test/orphan.yaml", "down")
 		res := c.RunDockerCmd("ps", "--all")
 		assert.Assert(t, !strings.Contains(res.Stdout(), "run-test"), res.Stdout())
 	})

+ 5 - 0
pkg/e2e/fixtures/run-test/orphan.yaml

@@ -0,0 +1,5 @@
+version: '3.8'
+services:
+  simple:
+    image: alpine
+    command: echo "Hi there!!"