diff --git a/local/compose/containers.go b/local/compose/containers.go index ad1790971..4b57ad7d4 100644 --- a/local/compose/containers.go +++ b/local/compose/containers.go @@ -43,6 +43,9 @@ func (s *composeService) getContainers(ctx context.Context, project string, oneO f := filters.NewArgs( projectFilter(project), ) + if len(selectedServices) == 1 { + f.Add("label", fmt.Sprintf("%s=%s", serviceLabel, selectedServices[0])) + } switch oneOff { case oneOffOnly: f.Add("label", fmt.Sprintf("%s=%s", oneoffLabel, "True")) @@ -57,7 +60,7 @@ func (s *composeService) getContainers(ctx context.Context, project string, oneO if err != nil { return nil, err } - if len(selectedServices) > 0 { + if len(selectedServices) > 1 { containers = containers.filter(isService(selectedServices...)) } return containers, nil diff --git a/local/compose/convergence.go b/local/compose/convergence.go index 37f6baf11..559919603 100644 --- a/local/compose/convergence.go +++ b/local/compose/convergence.go @@ -337,16 +337,14 @@ func (s *composeService) connectContainerToNetwork(ctx context.Context, id strin } func (s *composeService) isServiceHealthy(ctx context.Context, project *types.Project, service string) (bool, error) { - containers, err := s.apiClient.ContainerList(ctx, moby.ContainerListOptions{ - Filters: filters.NewArgs( - projectFilter(project.Name), - serviceFilter(service), - ), - }) + containers, err := s.getContainers(ctx, project.Name, oneOffExclude, false, service) if err != nil { return false, err } + if len(containers) == 0 { + return false, nil + } for _, c := range containers { container, err := s.apiClient.ContainerInspect(ctx, c.ID) if err != nil { @@ -355,10 +353,7 @@ func (s *composeService) isServiceHealthy(ctx context.Context, project *types.Pr if container.State == nil || container.State.Health == nil { return false, fmt.Errorf("container for service %q has no healthcheck configured", service) } - switch container.State.Health.Status { - case "starting": - return false, nil - case "unhealthy": + if container.State.Health.Status != moby.Healthy { return false, nil } } diff --git a/local/compose/exec.go b/local/compose/exec.go index d2230085a..90fcba37e 100644 --- a/local/compose/exec.go +++ b/local/compose/exec.go @@ -83,7 +83,7 @@ func (s *composeService) Exec(ctx context.Context, project *types.Project, opts defer resp.Close() if opts.Tty { - err := s.monitorTTySize(ctx, exec.ID, s.apiClient.ContainerExecResize) + s.monitorTTySize(ctx, exec.ID, s.apiClient.ContainerExecResize) if err != nil { return err } diff --git a/local/compose/resize.go b/local/compose/resize.go index 8453d4e63..0c9723810 100644 --- a/local/compose/resize.go +++ b/local/compose/resize.go @@ -28,13 +28,13 @@ import ( "github.com/docker/docker/pkg/signal" ) -func (s *composeService) monitorTTySize(ctx context.Context, container string, resize func(context.Context, string, moby.ResizeOptions) error) error { +func (s *composeService) monitorTTySize(ctx context.Context, container string, resize func(context.Context, string, moby.ResizeOptions) error) { err := resize(ctx, container, moby.ResizeOptions{ // nolint:errcheck Height: uint(goterm.Height()), Width: uint(goterm.Width()), }) if err != nil { - return err + return } sigchan := make(chan os.Signal, 1) @@ -71,5 +71,4 @@ func (s *composeService) monitorTTySize(ctx context.Context, container string, r } } }() - return nil } diff --git a/local/compose/run.go b/local/compose/run.go index 79b355677..aad04d7b4 100644 --- a/local/compose/run.go +++ b/local/compose/run.go @@ -89,17 +89,15 @@ func (s *composeService) RunOneOffContainer(ctx context.Context, project *types. } defer restore() + statusC, errC := s.apiClient.ContainerWait(context.Background(), oneoffContainer.ID, container.WaitConditionNextExit) + err = s.apiClient.ContainerStart(ctx, containerID, apitypes.ContainerStartOptions{}) if err != nil { return 0, err } - err = s.monitorTTySize(ctx, containerID, s.apiClient.ContainerResize) - if err != nil { - return 0, err - } + s.monitorTTySize(ctx, containerID, s.apiClient.ContainerResize) - statusC, errC := s.apiClient.ContainerWait(context.Background(), oneoffContainer.ID, container.WaitConditionNotRunning) select { case status := <-statusC: return int(status.StatusCode), nil