Browse code

Fix permissions on ADD/COPY

Fix a regression introduced in PR#9467 when a single file was added or
copied.

Signed-off-by: Arnaud Porterie <arnaud.porterie@docker.com>

Arnaud Porterie authored on 2014/12/11 04:09:03
Showing 2 changed files
... ...
@@ -660,11 +660,19 @@ func copyAsDirectory(source, destination string) error {
660 660
 }
661 661
 
662 662
 func fixPermissions(source, destination string, uid, gid int) error {
663
+	// The copied root permission should not be changed for previously existing
664
+	// directories.
665
+	s, err := os.Stat(destination)
666
+	if err != nil && !os.IsNotExist(err) {
667
+		return err
668
+	}
669
+	fixRootPermission := (err != nil) || !s.IsDir()
670
+
663 671
 	// We Walk on the source rather than on the destination because we don't
664 672
 	// want to change permissions on things we haven't created or modified.
665 673
 	return filepath.Walk(source, func(fullpath string, info os.FileInfo, err error) error {
666 674
 		// Do not alter the walk root itself as it potentially existed before.
667
-		if source == fullpath {
675
+		if !fixRootPermission && (source == fullpath) {
668 676
 			return nil
669 677
 		}
670 678
 		// Path is prefixed by source: substitute with destination instead.
... ...
@@ -3564,3 +3564,31 @@ func TestBuildStderr(t *testing.T) {
3564 3564
 	}
3565 3565
 	logDone("build - testing stderr")
3566 3566
 }
3567
+
3568
+func TestBuildChownSingleFile(t *testing.T) {
3569
+	name := "testbuildchownsinglefile"
3570
+	defer deleteImages(name)
3571
+
3572
+	ctx, err := fakeContext(`
3573
+FROM busybox
3574
+COPY test /
3575
+RUN ls -l /test
3576
+RUN [ $(ls -l /test | awk '{print $3":"$4}') = 'root:root' ]
3577
+`, map[string]string{
3578
+		"test": "test",
3579
+	})
3580
+	if err != nil {
3581
+		t.Fatal(err)
3582
+	}
3583
+	defer ctx.Close()
3584
+
3585
+	if err := os.Chown(filepath.Join(ctx.Dir, "test"), 4242, 4242); err != nil {
3586
+		t.Fatal(err)
3587
+	}
3588
+
3589
+	if _, err := buildImageFromContext(name, ctx, true); err != nil {
3590
+		t.Fatal(err)
3591
+	}
3592
+
3593
+	logDone("build - change permission on single file")
3594
+}