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