From bcaa908f742d55f9d1e598829f8e8c902c0c6872 Mon Sep 17 00:00:00 2001 From: PIG208 <359101898@qq.com> Date: Thu, 13 Jan 2022 17:34:46 -0500 Subject: [PATCH] Support COMPOSE_IGNORE_ORPHANS for compose run This revives #7020 and resolves the issue mentioned in #4992. Signed-off-by: Zixuan James Li <359101898@qq.com> --- cmd/compose/run.go | 11 ++++++++--- pkg/e2e/compose_run_test.go | 14 ++++++++++++++ pkg/e2e/fixtures/run-test/orphan.yaml | 5 +++++ 3 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 pkg/e2e/fixtures/run-test/orphan.yaml diff --git a/cmd/compose/run.go b/cmd/compose/run.go index ee94e2cb0..54803d7cf 100644 --- a/cmd/compose/run.go +++ b/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{}) diff --git a/pkg/e2e/compose_run_test.go b/pkg/e2e/compose_run_test.go index 9940c2985..fdd5803d7 100644 --- a/pkg/e2e/compose_run_test.go +++ b/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()) }) diff --git a/pkg/e2e/fixtures/run-test/orphan.yaml b/pkg/e2e/fixtures/run-test/orphan.yaml new file mode 100644 index 000000000..a2aedb373 --- /dev/null +++ b/pkg/e2e/fixtures/run-test/orphan.yaml @@ -0,0 +1,5 @@ +version: '3.8' +services: + simple: + image: alpine + command: echo "Hi there!!"