| ... | ... |
@@ -1575,8 +1575,7 @@ func (container *Container) GetSize() (int64, int64) {
|
| 1575 | 1575 |
} |
| 1576 | 1576 |
} |
| 1577 | 1577 |
|
| 1578 |
- _, err = os.Stat(container.RootfsPath()) |
|
| 1579 |
- if err == nil {
|
|
| 1578 |
+ if _, err = os.Stat(container.RootfsPath()); err != nil {
|
|
| 1580 | 1579 |
filepath.Walk(container.RootfsPath(), func(path string, fileInfo os.FileInfo, err error) error {
|
| 1581 | 1580 |
if fileInfo != nil {
|
| 1582 | 1581 |
sizeRootfs += fileInfo.Size() |
| ... | ... |
@@ -62,19 +62,27 @@ func LoadImage(root string) (*Image, error) {
|
| 62 | 62 |
return img, nil |
| 63 | 63 |
} |
| 64 | 64 |
|
| 65 |
-func StoreImage(img *Image, jsonData []byte, layerData archive.Archive, root, rootfs string) error {
|
|
| 65 |
+func StoreImage(img *Image, jsonData []byte, layerData archive.Archive, root, layer string) error {
|
|
| 66 | 66 |
// Store the layer |
| 67 |
- layer := rootfs |
|
| 67 |
+ var ( |
|
| 68 |
+ size int64 |
|
| 69 |
+ err error |
|
| 70 |
+ driver = img.graph.driver |
|
| 71 |
+ ) |
|
| 68 | 72 |
if err := os.MkdirAll(layer, 0755); err != nil {
|
| 69 | 73 |
return err |
| 70 | 74 |
} |
| 71 | 75 |
|
| 72 | 76 |
// If layerData is not nil, unpack it into the new layer |
| 73 | 77 |
if layerData != nil {
|
| 74 |
- if differ, ok := img.graph.driver.(graphdriver.Differ); ok {
|
|
| 78 |
+ if differ, ok := driver.(graphdriver.Differ); ok {
|
|
| 75 | 79 |
if err := differ.ApplyDiff(img.ID, layerData); err != nil {
|
| 76 | 80 |
return err |
| 77 | 81 |
} |
| 82 |
+ |
|
| 83 |
+ if size, err = differ.DiffSize(img.ID); err != nil {
|
|
| 84 |
+ return err |
|
| 85 |
+ } |
|
| 78 | 86 |
} else {
|
| 79 | 87 |
start := time.Now() |
| 80 | 88 |
utils.Debugf("Start untar layer")
|
| ... | ... |
@@ -82,6 +90,24 @@ func StoreImage(img *Image, jsonData []byte, layerData archive.Archive, root, ro |
| 82 | 82 |
return err |
| 83 | 83 |
} |
| 84 | 84 |
utils.Debugf("Untar time: %vs", time.Now().Sub(start).Seconds())
|
| 85 |
+ |
|
| 86 |
+ if img.Parent == "" {
|
|
| 87 |
+ if size, err = utils.TreeSize(layer); err != nil {
|
|
| 88 |
+ return err |
|
| 89 |
+ } |
|
| 90 |
+ } else {
|
|
| 91 |
+ parent, err := driver.Get(img.Parent) |
|
| 92 |
+ if err != nil {
|
|
| 93 |
+ return err |
|
| 94 |
+ } |
|
| 95 |
+ changes, err := archive.ChangesDirs(layer, parent) |
|
| 96 |
+ if err != nil {
|
|
| 97 |
+ return err |
|
| 98 |
+ } |
|
| 99 |
+ if size = archive.ChangesSize(layer, changes); err != nil {
|
|
| 100 |
+ return err |
|
| 101 |
+ } |
|
| 102 |
+ } |
|
| 85 | 103 |
} |
| 86 | 104 |
} |
| 87 | 105 |
|
| ... | ... |
@@ -90,18 +116,13 @@ func StoreImage(img *Image, jsonData []byte, layerData archive.Archive, root, ro |
| 90 | 90 |
return ioutil.WriteFile(jsonPath(root), jsonData, 0600) |
| 91 | 91 |
} |
| 92 | 92 |
// Otherwise, unmarshal the image |
| 93 |
- jsonData, err := json.Marshal(img) |
|
| 94 |
- if err != nil {
|
|
| 93 |
+ if jsonData, err = json.Marshal(img); err != nil {
|
|
| 95 | 94 |
return err |
| 96 | 95 |
} |
| 97 | 96 |
if err := ioutil.WriteFile(jsonPath(root), jsonData, 0600); err != nil {
|
| 98 | 97 |
return err |
| 99 | 98 |
} |
| 100 |
- // Compute and save the size of the rootfs |
|
| 101 |
- size, err := utils.TreeSize(rootfs) |
|
| 102 |
- if err != nil {
|
|
| 103 |
- return fmt.Errorf("Error computing size of rootfs %s: %s", img.ID, err)
|
|
| 104 |
- } |
|
| 99 |
+ |
|
| 105 | 100 |
img.Size = size |
| 106 | 101 |
if err := img.SaveSize(root); err != nil {
|
| 107 | 102 |
return err |