diff --git a/cmd/compose/up.go b/cmd/compose/up.go index 0015855aa..70460d64a 100644 --- a/cmd/compose/up.go +++ b/cmd/compose/up.go @@ -175,6 +175,7 @@ func runUp(ctx context.Context, backend api.Service, createOptions createOptions } create := api.CreateOptions{ + Services: services, RemoveOrphans: createOptions.removeOrphans, Recreate: createOptions.recreateStrategy(), RecreateDependencies: createOptions.dependenciesRecreateStrategy(), diff --git a/pkg/api/api.go b/pkg/api/api.go index 3e3df639e..00f3a3116 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -186,6 +186,8 @@ type ImagesOptions struct { // KillOptions group options of the Kill API type KillOptions struct { + // Services passed in the command line to be killed + Services []string // Signal to send to containers Signal string } diff --git a/pkg/compose/kill.go b/pkg/compose/kill.go index 308f60f1d..fb8199993 100644 --- a/pkg/compose/kill.go +++ b/pkg/compose/kill.go @@ -36,8 +36,13 @@ func (s *composeService) Kill(ctx context.Context, project *types.Project, optio func (s *composeService) kill(ctx context.Context, project *types.Project, options api.KillOptions) error { w := progress.ContextWriter(ctx) + services := options.Services + if len(services) == 0 { + services = project.ServiceNames() + } + var containers Containers - containers, err := s.getContainers(ctx, project.Name, oneOffInclude, true) + containers, err := s.getContainers(ctx, project.Name, oneOffInclude, true, services...) if err != nil { return err } diff --git a/pkg/compose/kill_test.go b/pkg/compose/kill_test.go index 311421239..6a85c31c2 100644 --- a/pkg/compose/kill_test.go +++ b/pkg/compose/kill_test.go @@ -56,18 +56,24 @@ func TestKillAll(t *testing.T) { } func TestKillSignal(t *testing.T) { + const serviceName = "service1" mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() api := mocks.NewMockAPIClient(mockCtrl) tested.apiClient = api - project := types.Project{Name: strings.ToLower(testProject), Services: []types.ServiceConfig{testService("service1")}} + project := types.Project{Name: strings.ToLower(testProject), Services: []types.ServiceConfig{testService(serviceName)}} + listOptions := moby.ContainerListOptions{ + Filters: filters.NewArgs(projectFilter(strings.ToLower(testProject)), + serviceFilter(serviceName)), + All: true, + } ctx := context.Background() - api.EXPECT().ContainerList(ctx, projectFilterListOpt()).Return([]moby.Container{testContainer("service1", "123", false)}, nil) + api.EXPECT().ContainerList(ctx, listOptions).Return([]moby.Container{testContainer(serviceName, "123", false)}, nil) api.EXPECT().ContainerKill(anyCancellableContext(), "123", "SIGTERM").Return(nil) - err := tested.kill(ctx, &project, compose.KillOptions{Signal: "SIGTERM"}) + err := tested.kill(ctx, &project, compose.KillOptions{Services: []string{serviceName}, Signal: "SIGTERM"}) assert.NilError(t, err) } diff --git a/pkg/compose/up.go b/pkg/compose/up.go index 64b100f57..47256b7b5 100644 --- a/pkg/compose/up.go +++ b/pkg/compose/up.go @@ -60,10 +60,14 @@ func (s *composeService) Up(ctx context.Context, project *types.Project, options return progress.Run(ctx, func(ctx context.Context) error { go func() { <-signalChan - s.Kill(ctx, project, api.KillOptions{}) // nolint:errcheck + s.Kill(ctx, project, api.KillOptions{ // nolint:errcheck + Services: options.Create.Services, + }) }() - return s.Stop(ctx, project, api.StopOptions{}) + return s.Stop(ctx, project, api.StopOptions{ + Services: options.Create.Services, + }) }) } go func() {