浏览代码

Merge pull request #2037 from ndeloof/volume_from_deps

include volume_from as a source for implicit dependencies
Nicolas De loof 4 年之前
父节点
当前提交
a5e8ab2d64
共有 1 个文件被更改,包括 44 次插入14 次删除
  1. 44 14
      pkg/compose/create.go

+ 44 - 14
pkg/compose/create.go

@@ -101,7 +101,10 @@ func (s *composeService) create(ctx context.Context, project *types.Project, opt
 		}
 	}
 
-	prepareServicesDependsOn(project)
+	err = prepareServicesDependsOn(project)
+	if err != nil {
+		return err
+	}
 
 	return newConvergence(options.Services, observedState, s).apply(ctx, project, options)
 }
@@ -138,28 +141,55 @@ func prepareNetworks(project *types.Project) {
 	}
 }
 
-func prepareServicesDependsOn(p *types.Project) {
-outLoop:
-	for i := range p.Services {
-		networkDependency := getDependentServiceFromMode(p.Services[i].NetworkMode)
-		ipcDependency := getDependentServiceFromMode(p.Services[i].Ipc)
-		pidDependency := getDependentServiceFromMode(p.Services[i].Pid)
+func prepareServicesDependsOn(p *types.Project) error {
+	for i, service := range p.Services {
+		var dependencies []string
+		networkDependency := getDependentServiceFromMode(service.NetworkMode)
+		if networkDependency != "" {
+			dependencies = append(dependencies, networkDependency)
+		}
 
-		if networkDependency == "" && ipcDependency == "" && pidDependency == "" {
+		ipcDependency := getDependentServiceFromMode(service.Ipc)
+		if ipcDependency != "" {
+			dependencies = append(dependencies, ipcDependency)
+		}
+
+		pidDependency := getDependentServiceFromMode(service.Pid)
+		if pidDependency != "" {
+			dependencies = append(dependencies, pidDependency)
+		}
+
+		for _, vol := range service.VolumesFrom {
+			spec := strings.Split(vol, ":")
+			if len(spec) == 0 {
+				continue
+			}
+			if spec[0] == "container" {
+				continue
+			}
+			dependencies = append(dependencies, spec[0])
+		}
+
+		if len(dependencies) == 0 {
 			continue
 		}
-		if p.Services[i].DependsOn == nil {
-			p.Services[i].DependsOn = make(types.DependsOnConfig)
+		if service.DependsOn == nil {
+			service.DependsOn = make(types.DependsOnConfig)
 		}
-		for _, service := range p.Services {
-			if service.Name == networkDependency || service.Name == ipcDependency || service.Name == pidDependency {
-				p.Services[i].DependsOn[service.Name] = types.ServiceDependency{
+		deps, err := p.GetServices(dependencies...)
+		if err != nil {
+			return err
+		}
+		for _, d := range deps {
+			if _, ok := service.DependsOn[d.Name]; !ok {
+				service.DependsOn[d.Name] = types.ServiceDependency{
 					Condition: types.ServiceConditionStarted,
 				}
-				continue outLoop
 			}
 		}
+		p.Services[i] = service
 	}
+	return nil
 }
 
 func (s *composeService) ensureNetworks(ctx context.Context, networks types.Networks) error {