Docker-DCO-1.1-Signed-off-by: Kato Kazuyoshi <kato.kazuyoshi@gmail.com> (github: kzys)
| ... | ... |
@@ -1,6 +1,7 @@ |
| 1 | 1 |
package vfs |
| 2 | 2 |
|
| 3 | 3 |
import ( |
| 4 |
+ "bytes" |
|
| 4 | 5 |
"fmt" |
| 5 | 6 |
"github.com/dotcloud/docker/daemon/graphdriver" |
| 6 | 7 |
"os" |
| ... | ... |
@@ -35,8 +36,24 @@ func (d *Driver) Cleanup() error {
|
| 35 | 35 |
return nil |
| 36 | 36 |
} |
| 37 | 37 |
|
| 38 |
+func isGNUcoreutils() bool {
|
|
| 39 |
+ if stdout, err := exec.Command("cp", "--version").Output(); err == nil {
|
|
| 40 |
+ return bytes.Contains(stdout, []byte("GNU coreutils"))
|
|
| 41 |
+ } |
|
| 42 |
+ |
|
| 43 |
+ return false |
|
| 44 |
+} |
|
| 45 |
+ |
|
| 38 | 46 |
func copyDir(src, dst string) error {
|
| 39 |
- if output, err := exec.Command("cp", "-aT", "--reflink=auto", src, dst).CombinedOutput(); err != nil {
|
|
| 47 |
+ argv := make([]string, 0, 4) |
|
| 48 |
+ |
|
| 49 |
+ if isGNUcoreutils() {
|
|
| 50 |
+ argv = append(argv, "-aT", "--reflink=auto", src, dst) |
|
| 51 |
+ } else {
|
|
| 52 |
+ argv = append(argv, "-a", src+"/.", dst+"/.") |
|
| 53 |
+ } |
|
| 54 |
+ |
|
| 55 |
+ if output, err := exec.Command("cp", argv...).CombinedOutput(); err != nil {
|
|
| 40 | 56 |
return fmt.Errorf("Error VFS copying directory: %s (%s)", err, output)
|
| 41 | 57 |
} |
| 42 | 58 |
return nil |