From 01d91c490ca4e93d092d442cbbc62b5f46416ace Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Thu, 25 May 2023 17:02:08 +0200 Subject: [PATCH] detect new container from project have started when running `compose logs` with no explicit services Signed-off-by: Nicolas De Loof --- pkg/compose/events.go | 5 ++--- pkg/compose/logs.go | 7 +++---- pkg/compose/start.go | 25 ++++++++++++++++++++++++- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/pkg/compose/events.go b/pkg/compose/events.go index 172e3eec2..e664133be 100644 --- a/pkg/compose/events.go +++ b/pkg/compose/events.go @@ -25,7 +25,6 @@ import ( "github.com/docker/docker/api/types/filters" "github.com/docker/compose/v2/pkg/api" - "github.com/docker/compose/v2/pkg/utils" ) @@ -67,8 +66,8 @@ func (s *composeService) Events(ctx context.Context, projectName string, options err := options.Consumer(api.Event{ Timestamp: timestamp, Service: service, - Container: event.ID, - Status: event.Status, + Container: event.Actor.ID, + Status: event.Action, Attributes: attributes, }) if err != nil { diff --git a/pkg/compose/logs.go b/pkg/compose/logs.go index 6a67d0143..2d9d716d0 100644 --- a/pkg/compose/logs.go +++ b/pkg/compose/logs.go @@ -51,13 +51,12 @@ func (s *composeService) Logs( if err != nil { return err } - } - - if len(options.Services) == 0 { + } else if len(options.Services) == 0 { + // we run with an explicit compose.yaml, so only consider services defined in this file options.Services = project.ServiceNames() + containers = containers.filter(isService(options.Services...)) } - containers = containers.filter(isService(options.Services...)) eg, ctx := errgroup.WithContext(ctx) for _, c := range containers { c := c diff --git a/pkg/compose/start.go b/pkg/compose/start.go index bd2ebcacd..66520cd84 100644 --- a/pkg/compose/start.go +++ b/pkg/compose/start.go @@ -155,13 +155,31 @@ func (s *composeService) watchContainers(ctx context.Context, //nolint:gocyclo required = services } + // predicate to tell if a container we receive event for should be considered or ignored + ofInterest := func(c moby.Container) bool { + if len(services) > 0 { + // we only watch some services + return utils.Contains(services, c.Labels[api.ServiceLabel]) + } + return true + } + + // predicate to tell if a container we receive event for should be watched until termination + isRequired := func(c moby.Container) bool { + if len(services) > 0 && len(required) > 0 { + // we only watch some services + return utils.Contains(required, c.Labels[api.ServiceLabel]) + } + return true + } + var ( expected []string watched = map[string]int{} replaced []string ) for _, c := range containers { - if utils.Contains(required, c.Labels[api.ServiceLabel]) { + if isRequired(c) { expected = append(expected, c.ID) } watched[c.ID] = 0 @@ -265,6 +283,11 @@ func (s *composeService) watchContainers(ctx context.Context, //nolint:gocyclo if utils.Contains(expected, id) { expected = append(expected, container.ID) } + } else if ofInterest(container) { + watched[container.ID] = 1 + if isRequired(container) { + expected = append(expected, container.ID) + } } } if len(expected) == 0 {