diff --git a/cmd/compose/ps.go b/cmd/compose/ps.go index d79d35ed..17581aec 100644 --- a/cmd/compose/ps.go +++ b/cmd/compose/ps.go @@ -91,11 +91,12 @@ func psCommand(p *projectOptions, backend api.Service) *cobra.Command { } func runPs(ctx context.Context, backend api.Service, services []string, opts psOptions) error { - projectName, err := opts.toProjectName() + project, name, err := opts.projectOrName() if err != nil { return err } - containers, err := backend.Ps(ctx, projectName, api.PsOptions{ + containers, err := backend.Ps(ctx, name, api.PsOptions{ + Project: project, All: opts.All, Services: services, }) diff --git a/pkg/api/api.go b/pkg/api/api.go index 94752285..9c3fc240 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -280,6 +280,7 @@ type ListOptions struct { // PsOptions group options of the Ps API type PsOptions struct { + Project *types.Project All bool Services []string } diff --git a/pkg/compose/ps.go b/pkg/compose/ps.go index de4b25f2..7df826a0 100644 --- a/pkg/compose/ps.go +++ b/pkg/compose/ps.go @@ -37,6 +37,19 @@ func (s *composeService) Ps(ctx context.Context, projectName string, options api return nil, err } + project := options.Project + if project == nil { + project, err = s.getProjectWithResources(ctx, containers, projectName) + if err != nil { + return nil, err + } + } + + if len(options.Services) == 0 { + options.Services = project.ServiceNames() + } + + containers = containers.filter(isService(options.Services...)) summary := make([]api.ContainerSummary, len(containers)) eg, ctx := errgroup.WithContext(ctx) for i, container := range containers { diff --git a/pkg/compose/ps_test.go b/pkg/compose/ps_test.go index 2f17616e..669b09e2 100644 --- a/pkg/compose/ps_test.go +++ b/pkg/compose/ps_test.go @@ -26,6 +26,7 @@ import ( moby "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/volume" compose "github.com/docker/compose/v2/pkg/api" "github.com/docker/compose/v2/pkg/mocks" @@ -48,6 +49,8 @@ func TestPs(t *testing.T) { c2, inspect2 := containerDetails("service1", "456", "running", "", 0) c2.Ports = []moby.Port{{PublicPort: 80, PrivatePort: 90, IP: "localhost"}} c3, inspect3 := containerDetails("service2", "789", "exited", "", 130) + api.EXPECT().VolumeList(ctx, gomock.Any()).Return(volume.VolumeListOKBody{}, nil) + api.EXPECT().NetworkList(ctx, gomock.Any()).Return([]moby.NetworkResource{}, nil) api.EXPECT().ContainerList(ctx, listOpts).Return([]moby.Container{c1, c2, c3}, nil) api.EXPECT().ContainerInspect(anyCancellableContext(), "123").Return(inspect1, nil) api.EXPECT().ContainerInspect(anyCancellableContext(), "456").Return(inspect2, nil)