github.com/docker/libcompose@v0.4.1-0.20210616120443-2a046c0bdbf2/project/project_containers.go (about)

     1  package project
     2  
     3  import (
     4  	"fmt"
     5  	"sync"
     6  
     7  	"golang.org/x/net/context"
     8  
     9  	"github.com/docker/libcompose/project/events"
    10  )
    11  
    12  // Containers lists the containers for the specified services. Can be filter using
    13  // the Filter struct.
    14  func (p *Project) Containers(ctx context.Context, filter Filter, services ...string) ([]string, error) {
    15  	containers := []string{}
    16  	var lock sync.Mutex
    17  
    18  	err := p.forEach(services, wrapperAction(func(wrapper *serviceWrapper, wrappers map[string]*serviceWrapper) {
    19  		wrapper.Do(nil, events.NoEvent, events.NoEvent, func(service Service) error {
    20  			serviceContainers, innerErr := service.Containers(ctx)
    21  			if innerErr != nil {
    22  				return innerErr
    23  			}
    24  
    25  			for _, container := range serviceContainers {
    26  				running := container.IsRunning(ctx)
    27  				switch filter.State {
    28  				case Running:
    29  					if !running {
    30  						continue
    31  					}
    32  				case Stopped:
    33  					if running {
    34  						continue
    35  					}
    36  				case AnyState:
    37  					// Don't do a thing
    38  				default:
    39  					// Invalid state filter
    40  					return fmt.Errorf("Invalid container filter: %s", filter.State)
    41  				}
    42  				containerID := container.ID()
    43  				lock.Lock()
    44  				containers = append(containers, containerID)
    45  				lock.Unlock()
    46  			}
    47  			return nil
    48  		})
    49  	}), nil)
    50  	if err != nil {
    51  		return nil, err
    52  	}
    53  	return containers, nil
    54  }