@@ -100,7 +100,7 @@ func (s *composeService) Create(ctx context.Context, project *types.Project, opt
100
100
}
101
101
}
102
102
103
- prepareNetworkMode (project )
103
+ prepareServicesDependsOn (project )
104
104
105
105
return InDependencyOrder (ctx , project , func (c context.Context , service types.ServiceConfig ) error {
106
106
if utils .StringContains (opts .Services , service .Name ) {
@@ -142,18 +142,20 @@ func prepareNetworks(project *types.Project) {
142
142
}
143
143
}
144
144
145
- func prepareNetworkMode (p * types.Project ) {
145
+ func prepareServicesDependsOn (p * types.Project ) {
146
146
outLoop:
147
147
for i := range p .Services {
148
- dependency := getDependentServiceByNetwork (p .Services [i ].NetworkMode )
149
- if dependency == "" {
148
+ networkDependency := getDependentServiceFromMode (p .Services [i ].NetworkMode )
149
+ ipcDependency := getDependentServiceFromMode (p .Services [i ].Ipc )
150
+
151
+ if networkDependency == "" && ipcDependency == "" {
150
152
continue
151
153
}
152
154
if p .Services [i ].DependsOn == nil {
153
155
p .Services [i ].DependsOn = make (types.DependsOnConfig )
154
156
}
155
157
for _ , service := range p .Services {
156
- if service .Name == dependency {
158
+ if service .Name == networkDependency || service . Name == ipcDependency {
157
159
p .Services [i ].DependsOn [service .Name ] = types.ServiceDependency {
158
160
Condition : types .ServiceConditionStarted ,
159
161
}
@@ -269,7 +271,14 @@ func (s *composeService) getCreateOptions(ctx context.Context, p *types.Project,
269
271
270
272
resources := getDeployResources (service )
271
273
272
- networkMode , err := getNetworkMode (ctx , p , service )
274
+ networkMode , err := getMode (ctx , service .Name , service .NetworkMode )
275
+ if err != nil {
276
+ return nil , nil , nil , err
277
+ }
278
+ if networkMode == "" {
279
+ networkMode = getDefaultNetworkMode (p , service )
280
+ }
281
+ ipcmode , err := getMode (ctx , service .Name , service .Ipc )
273
282
if err != nil {
274
283
return nil , nil , nil , err
275
284
}
@@ -305,8 +314,9 @@ func (s *composeService) getCreateOptions(ctx context.Context, p *types.Project,
305
314
Mounts : mounts ,
306
315
CapAdd : strslice .StrSlice (service .CapAdd ),
307
316
CapDrop : strslice .StrSlice (service .CapDrop ),
308
- NetworkMode : networkMode ,
317
+ NetworkMode : container . NetworkMode ( networkMode ) ,
309
318
Init : service .Init ,
319
+ IpcMode : container .IpcMode (ipcmode ),
310
320
ReadonlyRootfs : service .ReadOnly ,
311
321
RestartPolicy : getRestartPolicy (service ),
312
322
ShmSize : shmSize ,
@@ -328,10 +338,21 @@ func (s *composeService) getCreateOptions(ctx context.Context, p *types.Project,
328
338
LogConfig : logConfig ,
329
339
}
330
340
331
- networkConfig := buildDefaultNetworkConfig (service , networkMode , getContainerName (p .Name , service , number ))
341
+ networkConfig := buildDefaultNetworkConfig (service , container . NetworkMode ( networkMode ) , getContainerName (p .Name , service , number ))
332
342
return & containerConfig , & hostConfig , networkConfig , nil
333
343
}
334
344
345
+ func getDefaultNetworkMode (project * types.Project , service types.ServiceConfig ) string {
346
+ mode := "none"
347
+ if len (project .Networks ) > 0 {
348
+ for name := range getNetworksForService (service ) {
349
+ mode = project .Networks [name ].Name
350
+ break
351
+ }
352
+ }
353
+ return mode
354
+ }
355
+
335
356
func getRestartPolicy (service types.ServiceConfig ) container.RestartPolicy {
336
357
var restart container.RestartPolicy
337
358
if service .Restart != "" {
@@ -470,12 +491,11 @@ func getVolumesFrom(project *types.Project, volumesFrom []string) ([]string, []s
470
491
471
492
}
472
493
473
- func getDependentServiceByNetwork (networkMode string ) string {
474
- baseService := ""
475
- if strings .HasPrefix (networkMode , types .NetworkModeServicePrefix ) {
476
- return networkMode [len (types .NetworkModeServicePrefix ):]
494
+ func getDependentServiceFromMode (mode string ) string {
495
+ if strings .HasPrefix (mode , types .NetworkModeServicePrefix ) {
496
+ return mode [len (types .NetworkModeServicePrefix ):]
477
497
}
478
- return baseService
498
+ return ""
479
499
}
480
500
481
501
func (s * composeService ) buildContainerVolumes (ctx context.Context , p types.Project , service types.ServiceConfig ,
@@ -745,33 +765,22 @@ func getAliases(s types.ServiceConfig, c *types.ServiceNetworkConfig) []string {
745
765
return aliases
746
766
}
747
767
748
- func getNetworkMode (ctx context.Context , p * types. Project , service types. ServiceConfig ) (container. NetworkMode , error ) {
768
+ func getMode (ctx context.Context , serviceName string , mode string ) (string , error ) {
749
769
cState , err := GetContextContainerState (ctx )
750
770
if err != nil {
751
- return container . NetworkMode ( "none" ) , nil
771
+ return "" , nil
752
772
}
753
773
observedState := cState .GetContainers ()
754
-
755
- mode := service .NetworkMode
756
- if mode == "" {
757
- if len (p .Networks ) > 0 {
758
- for name := range getNetworksForService (service ) {
759
- return container .NetworkMode (p .Networks [name ].Name ), nil
760
- }
761
- }
762
- return container .NetworkMode ("none" ), nil
763
- }
764
- depServiceNetworkMode := getDependentServiceByNetwork (service .NetworkMode )
765
- if depServiceNetworkMode != "" {
766
- depServiceContainers := observedState .filter (isService (depServiceNetworkMode ))
774
+ depService := getDependentServiceFromMode (mode )
775
+ if depService != "" {
776
+ depServiceContainers := observedState .filter (isService (depService ))
767
777
if len (depServiceContainers ) > 0 {
768
- return container . NetworkMode ( types .NetworkModeContainerPrefix + depServiceContainers [0 ].ID ) , nil
778
+ return types .NetworkModeContainerPrefix + depServiceContainers [0 ].ID , nil
769
779
}
770
- return container .NetworkMode ("none" ),
771
- fmt .Errorf (`no containers started for network_mode %q in service %q -> %v` ,
772
- mode , service .Name , observedState )
780
+ return "" , fmt .Errorf (`no containers started for %q in service %q -> %v` ,
781
+ mode , serviceName , observedState )
773
782
}
774
- return container . NetworkMode ( mode ) , nil
783
+ return mode , nil
775
784
}
776
785
777
786
func getNetworksForService (s types.ServiceConfig ) map [string ]* types.ServiceNetworkConfig {
0 commit comments