From 733711481ee665564f0f2a77d100353d5f9c82e2 Mon Sep 17 00:00:00 2001 From: Kato Kazuyoshi Date: Sat, 21 Jun 2014 18:50:52 +0900 Subject: [PATCH] cp's -T and --reflink=auto are only available on GNU coreutils Docker-DCO-1.1-Signed-off-by: Kato Kazuyoshi (github: kzys) --- daemon/graphdriver/vfs/driver.go | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/daemon/graphdriver/vfs/driver.go b/daemon/graphdriver/vfs/driver.go index 992af0e149..7eaa22461f 100644 --- a/daemon/graphdriver/vfs/driver.go +++ b/daemon/graphdriver/vfs/driver.go @@ -1,6 +1,7 @@ package vfs import ( + "bytes" "fmt" "github.com/dotcloud/docker/daemon/graphdriver" "os" @@ -35,8 +36,24 @@ func (d *Driver) Cleanup() error { return nil } +func isGNUcoreutils() bool { + if stdout, err := exec.Command("cp", "--version").Output(); err == nil { + return bytes.Contains(stdout, []byte("GNU coreutils")) + } + + return false +} + func copyDir(src, dst string) error { - if output, err := exec.Command("cp", "-aT", "--reflink=auto", src, dst).CombinedOutput(); err != nil { + argv := make([]string, 0, 4) + + if isGNUcoreutils() { + argv = append(argv, "-aT", "--reflink=auto", src, dst) + } else { + argv = append(argv, "-a", src+"/.", dst+"/.") + } + + if output, err := exec.Command("cp", argv...).CombinedOutput(); err != nil { return fmt.Errorf("Error VFS copying directory: %s (%s)", err, output) } return nil