Procházet zdrojové kódy

Merge pull request #35579 from dnephin/fix-layer-dne

Fix layer DNE with duplicate layers
Tõnis Tiigi před 7 roky
rodič
revize
9fe48f081d
2 změnil soubory, kde provedl 29 přidání a 5 odebrání
  1. 1 5
      daemon/build.go
  2. 28 0
      integration/build/build_test.go

+ 1 - 5
daemon/build.go

@@ -71,11 +71,7 @@ func (rl *releaseableLayer) Commit(os string) (builder.ReleaseableLayer, error)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}
-
-	if layer.IsEmpty(newLayer.DiffID()) {
-		_, err := rl.layerStore.Release(newLayer)
-		return &releaseableLayer{layerStore: rl.layerStore}, err
-	}
+	// TODO: An optimization woudld be to handle empty layers before returning
 	return &releaseableLayer{layerStore: rl.layerStore, roLayer: newLayer}, nil
 	return &releaseableLayer{layerStore: rl.layerStore, roLayer: newLayer}, nil
 }
 }
 
 

+ 28 - 0
integration/build/build_test.go

@@ -169,3 +169,31 @@ func TestBuildMultiStageParentConfig(t *testing.T) {
 	assert.Equal(t, "/foo/sub2", image.Config.WorkingDir)
 	assert.Equal(t, "/foo/sub2", image.Config.WorkingDir)
 	assert.Contains(t, image.Config.Env, "WHO=parent")
 	assert.Contains(t, image.Config.Env, "WHO=parent")
 }
 }
+
+func TestBuildWithEmptyLayers(t *testing.T) {
+	dockerfile := `
+		FROM    busybox
+		COPY    1/ /target/
+		COPY    2/ /target/
+		COPY    3/ /target/
+	`
+	ctx := context.Background()
+	source := fakecontext.New(t, "",
+		fakecontext.WithDockerfile(dockerfile),
+		fakecontext.WithFile("1/a", "asdf"),
+		fakecontext.WithFile("2/a", "asdf"),
+		fakecontext.WithFile("3/a", "asdf"))
+	defer source.Close()
+
+	apiclient := testEnv.APIClient()
+	resp, err := apiclient.ImageBuild(ctx,
+		source.AsTarReader(t),
+		types.ImageBuildOptions{
+			Remove:      true,
+			ForceRemove: true,
+		})
+	require.NoError(t, err)
+	_, err = io.Copy(ioutil.Discard, resp.Body)
+	resp.Body.Close()
+	require.NoError(t, err)
+}