@@ -18,14 +18,13 @@ package compose
18
18
19
19
import (
20
20
"context"
21
+ "fmt"
21
22
"sort"
22
- "strconv"
23
-
24
- moby "github.com/docker/docker/api/types"
25
- "github.com/docker/docker/api/types/filters"
26
23
27
24
"github.com/docker/compose/v2/pkg/api"
28
25
"github.com/docker/compose/v2/pkg/utils"
26
+ moby "github.com/docker/docker/api/types"
27
+ "github.com/docker/docker/api/types/filters"
29
28
)
30
29
31
30
// Containers is a set of moby Container
@@ -41,7 +40,22 @@ const (
41
40
42
41
func (s * composeService ) getContainers (ctx context.Context , project string , oneOff oneOff , stopped bool , selectedServices ... string ) (Containers , error ) {
43
42
var containers Containers
44
- f := []filters.KeyValuePair {projectFilter (project )}
43
+ f := getDefaultFilters (project , oneOff , selectedServices ... )
44
+ containers , err := s .apiClient ().ContainerList (ctx , moby.ContainerListOptions {
45
+ Filters : filters .NewArgs (f ... ),
46
+ All : stopped ,
47
+ })
48
+ if err != nil {
49
+ return nil , err
50
+ }
51
+ if len (selectedServices ) > 1 {
52
+ containers = containers .filter (isService (selectedServices ... ))
53
+ }
54
+ return containers , nil
55
+ }
56
+
57
+ func getDefaultFilters (projectName string , oneOff oneOff , selectedServices ... string ) []filters.KeyValuePair {
58
+ f := []filters.KeyValuePair {projectFilter (projectName )}
45
59
if len (selectedServices ) == 1 {
46
60
f = append (f , serviceFilter (selectedServices [0 ]))
47
61
}
@@ -52,17 +66,26 @@ func (s *composeService) getContainers(ctx context.Context, project string, oneO
52
66
f = append (f , oneOffFilter (false ))
53
67
case oneOffInclude :
54
68
}
69
+ return f
70
+ }
71
+
72
+ func (s * composeService ) getSpecifiedContainer (ctx context.Context , projectName string , oneOff oneOff , stopped bool , serviceName string , containerIndex int ) (moby.Container , error ) {
73
+ defaultFilters := getDefaultFilters (projectName , oneOff , serviceName )
74
+ defaultFilters = append (defaultFilters , containerNumberFilter (containerIndex ))
55
75
containers , err := s .apiClient ().ContainerList (ctx , moby.ContainerListOptions {
56
- Filters : filters .NewArgs (f ... ),
57
- All : stopped ,
76
+ Filters : filters .NewArgs (
77
+ defaultFilters ... ,
78
+ ),
79
+ All : stopped ,
58
80
})
59
81
if err != nil {
60
- return nil , err
82
+ return moby. Container {} , err
61
83
}
62
- if len (selectedServices ) > 1 {
63
- containers = containers . filter ( isService ( selectedServices ... ) )
84
+ if len (containers ) < 1 {
85
+ return moby. Container {}, fmt . Errorf ( "service %q is not running container #%d" , serviceName , containerIndex )
64
86
}
65
- return containers , nil
87
+ container := containers [0 ]
88
+ return container , nil
66
89
}
67
90
68
91
// containerPredicate define a predicate we want container to satisfy for filtering operations
@@ -87,14 +110,6 @@ func isNotOneOff(c moby.Container) bool {
87
110
return ! ok || v == "False"
88
111
}
89
112
90
- func indexed (index int ) containerPredicate {
91
- return func (c moby.Container ) bool {
92
- number := c .Labels [api .ContainerNumberLabel ]
93
- idx , err := strconv .Atoi (number )
94
- return err == nil && index == idx
95
- }
96
- }
97
-
98
113
// filter return Containers with elements to match predicate
99
114
func (containers Containers ) filter (predicate containerPredicate ) Containers {
100
115
var filtered Containers
0 commit comments