@@ -23,6 +23,7 @@ import (
23
23
24
24
moby "github.com/docker/docker/api/types"
25
25
"github.com/docker/docker/api/types/filters"
26
+ "golang.org/x/sync/errgroup"
26
27
27
28
"github.com/docker/compose-cli/api/compose"
28
29
)
@@ -37,32 +38,49 @@ func (s *composeService) Ps(ctx context.Context, projectName string) ([]compose.
37
38
return nil , err
38
39
}
39
40
40
- var summary []compose.ContainerSummary
41
- for _ , c := range containers {
42
- var publishers []compose.PortPublisher
43
- for _ , p := range c .Ports {
44
- var url string
45
- if p .PublicPort != 0 {
46
- url = fmt .Sprintf ("%s:%d" , p .IP , p .PublicPort )
41
+ summary := make ([]compose.ContainerSummary , len (containers ))
42
+ eg , ctx := errgroup .WithContext (ctx )
43
+ for i , c := range containers {
44
+ container := c
45
+ i := i
46
+ eg .Go (func () error {
47
+ var publishers []compose.PortPublisher
48
+ for _ , p := range container .Ports {
49
+ var url string
50
+ if p .PublicPort != 0 {
51
+ url = fmt .Sprintf ("%s:%d" , p .IP , p .PublicPort )
52
+ }
53
+ publishers = append (publishers , compose.PortPublisher {
54
+ URL : url ,
55
+ TargetPort : int (p .PrivatePort ),
56
+ PublishedPort : int (p .PublicPort ),
57
+ Protocol : p .Type ,
58
+ })
59
+ }
60
+
61
+ inspect , err := s .apiClient .ContainerInspect (ctx , container .ID )
62
+ if err != nil {
63
+ return err
47
64
}
48
- publishers = append (publishers , compose.PortPublisher {
49
- URL : url ,
50
- TargetPort : int (p .PrivatePort ),
51
- PublishedPort : int (p .PublicPort ),
52
- Protocol : p .Type ,
53
- })
54
- }
55
65
56
- summary = append (summary , compose.ContainerSummary {
57
- ID : c .ID ,
58
- Name : getCanonicalContainerName (c ),
59
- Project : c .Labels [projectLabel ],
60
- Service : c .Labels [serviceLabel ],
61
- State : c .State ,
62
- Publishers : publishers ,
66
+ var health string
67
+ if inspect .State != nil && inspect .State .Health != nil {
68
+ health = inspect .State .Health .Status
69
+ }
70
+
71
+ summary [i ] = compose.ContainerSummary {
72
+ ID : container .ID ,
73
+ Name : getCanonicalContainerName (container ),
74
+ Project : container .Labels [projectLabel ],
75
+ Service : container .Labels [serviceLabel ],
76
+ State : container .State ,
77
+ Health : health ,
78
+ Publishers : publishers ,
79
+ }
80
+ return nil
63
81
})
64
82
}
65
- return summary , nil
83
+ return summary , eg . Wait ()
66
84
}
67
85
68
86
func groupContainerByLabel (containers []moby.Container , labelName string ) (map [string ][]moby.Container , []string , error ) {
0 commit comments