浏览代码

Merge pull request #9849 from laurazard/fix-volumesfrom-overwriting

Keep `depends_on` condition when service has `volumes_from`
Laura Brehm 3 年之前
父节点
当前提交
2977f4c897
共有 2 个文件被更改,包括 42 次插入1 次删除
  1. 2 1
      pkg/compose/create.go
  2. 40 0
      pkg/compose/create_test.go

+ 2 - 1
pkg/compose/create.go

@@ -125,7 +125,8 @@ func prepareVolumes(p *types.Project) error {
 				p.Services[i].DependsOn = make(types.DependsOnConfig, len(dependServices))
 			}
 			for _, service := range p.Services {
-				if utils.StringContains(dependServices, service.Name) {
+				if utils.StringContains(dependServices, service.Name) &&
+					p.Services[i].DependsOn[service.Name].Condition == "" {
 					p.Services[i].DependsOn[service.Name] = types.ServiceDependency{
 						Condition: types.ServiceConditionStarted,
 					}

+ 40 - 0
pkg/compose/create_test.go

@@ -96,6 +96,46 @@ func TestPrepareNetworkLabels(t *testing.T) {
 	}))
 }
 
+func TestPrepareVolumes(t *testing.T) {
+	t.Run("adds dependency condition if service depends on volume from another service", func(t *testing.T) {
+		project := composetypes.Project{
+			Name: "myProject",
+			Services: []composetypes.ServiceConfig{
+				{
+					Name:        "aService",
+					VolumesFrom: []string{"anotherService"},
+				},
+				{
+					Name: "anotherService",
+				},
+			},
+		}
+		err := prepareVolumes(&project)
+		assert.NilError(t, err)
+		assert.Equal(t, project.Services[0].DependsOn["anotherService"].Condition, composetypes.ServiceConditionStarted)
+	})
+	t.Run("doesn't overwrite existing dependency condition", func(t *testing.T) {
+		project := composetypes.Project{
+			Name: "myProject",
+			Services: []composetypes.ServiceConfig{
+				{
+					Name:        "aService",
+					VolumesFrom: []string{"anotherService"},
+					DependsOn: map[string]composetypes.ServiceDependency{
+						"anotherService": {Condition: composetypes.ServiceConditionHealthy},
+					},
+				},
+				{
+					Name: "anotherService",
+				},
+			},
+		}
+		err := prepareVolumes(&project)
+		assert.NilError(t, err)
+		assert.Equal(t, project.Services[0].DependsOn["anotherService"].Condition, composetypes.ServiceConditionHealthy)
+	})
+}
+
 func TestBuildContainerMountOptions(t *testing.T) {
 	project := composetypes.Project{
 		Name: "myProject",