fix layer size computation: handle hard links
This change makes docker compute layer size correctly. The old code isn't taking hard links into account. Layers could seem like they're up to 1-1.5x larger than they really were.
This commit is contained in:
parent
f946a486ea
commit
ac821f2446
1 changed files with 14 additions and 1 deletions
15
image.go
15
image.go
|
@ -16,6 +16,7 @@ import (
|
|||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
|
||||
|
@ -114,10 +115,22 @@ func StoreImage(img *Image, jsonData []byte, layerData archive.Archive, root str
|
|||
|
||||
func StoreSize(img *Image, root string) error {
|
||||
layer := layerPath(root)
|
||||
data := make(map[uint64]bool)
|
||||
|
||||
var totalSize int64 = 0
|
||||
filepath.Walk(layer, func(path string, fileInfo os.FileInfo, err error) error {
|
||||
totalSize += fileInfo.Size()
|
||||
size := fileInfo.Size()
|
||||
if size == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
inode := fileInfo.Sys().(*syscall.Stat_t).Ino
|
||||
if _, entryExists := data[inode]; entryExists {
|
||||
return nil
|
||||
}
|
||||
data[inode] = false
|
||||
|
||||
totalSize += size
|
||||
return nil
|
||||
})
|
||||
img.Size = totalSize
|
||||
|
|
Loading…
Add table
Reference in a new issue