@@ -155,6 +155,8 @@ func Normalize(project *types.Project, resolvePaths bool) error {
155
155
return err
156
156
}
157
157
158
+ inferImplicitDependencies (& s )
159
+
158
160
project .Services [i ] = s
159
161
}
160
162
@@ -171,6 +173,61 @@ func Normalize(project *types.Project, resolvePaths bool) error {
171
173
return nil
172
174
}
173
175
176
+ // IsServiceDependency check the relation set by ref refers to a service
177
+ func IsServiceDependency (ref string ) (string , bool ) {
178
+ if strings .HasPrefix (
179
+ ref ,
180
+ types .ServicePrefix ,
181
+ ) {
182
+ return ref [len (types .ServicePrefix ):], true
183
+ }
184
+ return "" , false
185
+ }
186
+
187
+ func inferImplicitDependencies (service * types.ServiceConfig ) {
188
+ var dependencies []string
189
+
190
+ maybeReferences := []string {
191
+ service .NetworkMode ,
192
+ service .Ipc ,
193
+ service .Pid ,
194
+ service .Uts ,
195
+ service .Cgroup ,
196
+ }
197
+ for _ , ref := range maybeReferences {
198
+ if dep , ok := IsServiceDependency (ref ); ok {
199
+ dependencies = append (dependencies , dep )
200
+ }
201
+ }
202
+
203
+ for _ , vol := range service .VolumesFrom {
204
+ spec := strings .Split (vol , ":" )
205
+ if len (spec ) == 0 {
206
+ continue
207
+ }
208
+ if spec [0 ] == "container" {
209
+ continue
210
+ }
211
+ dependencies = append (dependencies , spec [0 ])
212
+ }
213
+
214
+ for _ , link := range service .Links {
215
+ dependencies = append (dependencies , strings .Split (link , ":" )[0 ])
216
+ }
217
+
218
+ if len (dependencies ) > 0 && service .DependsOn == nil {
219
+ service .DependsOn = make (types.DependsOnConfig )
220
+ }
221
+
222
+ for _ , d := range dependencies {
223
+ if _ , ok := service .DependsOn [d ]; ! ok {
224
+ service .DependsOn [d ] = types.ServiceDependency {
225
+ Condition : types .ServiceConditionStarted ,
226
+ }
227
+ }
228
+ }
229
+ }
230
+
174
231
// setIfMissing adds a ServiceDependency for service if not already defined
175
232
func setIfMissing (d types.DependsOnConfig , service string , dep types.ServiceDependency ) types.DependsOnConfig {
176
233
if d == nil {
0 commit comments