summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Goodman <wagoodman@gmail.com>2019-03-16 12:03:59 -0400
committerAlex Goodman <wagoodman@gmail.com>2019-03-16 12:03:59 -0400
commit58f64045e498f2ef5f121701e65e7694a56b134f (patch)
treed0e48f400aabdc9cd0008a2e204ecf5f4d88c8c8
parent54592795760ed65810e7d30cb4d2e9ff8ad5a208 (diff)
dont depend on image history to exist (closes #169)
-rw-r--r--image/docker_image.go30
1 files changed, 21 insertions, 9 deletions
diff --git a/image/docker_image.go b/image/docker_image.go
index 685b34d..e637ae3 100644
--- a/image/docker_image.go
+++ b/image/docker_image.go
@@ -168,28 +168,40 @@ func (image *dockerImageAnalyzer) Analyze() (*AnalysisResult, error) {
// note that the image config stores images in reverse chronological order, so iterate backwards through layers
// as you iterate chronologically through history (ignoring history items that have no layer contents)
- layerIdx := len(image.trees) - 1
+ // Note: history is not required metadata in a docker image!
tarPathIdx := 0
- for histIdx := 0; histIdx < len(config.History); histIdx++ {
- // ignore empty layers, we are only observing layers with content
- if config.History[histIdx].EmptyLayer {
- continue
- }
+ histIdx := 0
+ for layerIdx := len(image.trees) - 1; layerIdx >= 0; layerIdx-- {
tree := image.trees[(len(image.trees)-1)-layerIdx]
- config.History[histIdx].Size = uint64(tree.FileSize)
+
+ // ignore empty layers, we are only observing layers with content
+ historyObj := dockerImageHistoryEntry{
+ CreatedBy: "(missing)",
+ }
+ for nextHistIdx := histIdx; nextHistIdx < len(config.History); nextHistIdx++ {
+ if !config.History[nextHistIdx].EmptyLayer {
+ histIdx = nextHistIdx
+ break
+ }
+ }
+ if histIdx < len(config.History) && !config.History[histIdx].EmptyLayer {
+ historyObj = config.History[histIdx]
+ histIdx++
+ }
image.layers[layerIdx] = &dockerLayer{
- history: config.History[histIdx],
+ history: historyObj,
index: tarPathIdx,
tree: image.trees[layerIdx],
tarPath: manifest.LayerTarPaths[tarPathIdx],
}
+ image.layers[layerIdx].history.Size = uint64(tree.FileSize)
- layerIdx--
tarPathIdx++
}
+
efficiency, inefficiencies := filetree.Efficiency(image.trees)
var sizeBytes, userSizeBytes uint64