github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/daemon/images/image_history.go (about) 1 package images // import "github.com/Prakhar-Agarwal-byte/moby/daemon/images" 2 3 import ( 4 "context" 5 "fmt" 6 "time" 7 8 "github.com/Prakhar-Agarwal-byte/moby/api/types/image" 9 "github.com/Prakhar-Agarwal-byte/moby/layer" 10 "github.com/distribution/reference" 11 ) 12 13 // ImageHistory returns a slice of ImageHistory structures for the specified image 14 // name by walking the image lineage. 15 func (i *ImageService) ImageHistory(ctx context.Context, name string) ([]*image.HistoryResponseItem, error) { 16 start := time.Now() 17 img, err := i.GetImage(ctx, name, image.GetImageOpts{}) 18 if err != nil { 19 return nil, err 20 } 21 22 history := []*image.HistoryResponseItem{} 23 24 layerCounter := 0 25 rootFS := *img.RootFS 26 rootFS.DiffIDs = nil 27 28 for _, h := range img.History { 29 var layerSize int64 30 31 if !h.EmptyLayer { 32 if len(img.RootFS.DiffIDs) <= layerCounter { 33 return nil, fmt.Errorf("too many non-empty layers in History section") 34 } 35 rootFS.Append(img.RootFS.DiffIDs[layerCounter]) 36 l, err := i.layerStore.Get(rootFS.ChainID()) 37 if err != nil { 38 return nil, err 39 } 40 layerSize = l.DiffSize() 41 layer.ReleaseAndLog(i.layerStore, l) 42 layerCounter++ 43 } 44 45 history = append([]*image.HistoryResponseItem{{ 46 ID: "<missing>", 47 Created: h.Created.Unix(), 48 CreatedBy: h.CreatedBy, 49 Comment: h.Comment, 50 Size: layerSize, 51 }}, history...) 52 } 53 54 // Fill in image IDs and tags 55 histImg := img 56 id := img.ID() 57 for _, h := range history { 58 h.ID = id.String() 59 60 var tags []string 61 for _, r := range i.referenceStore.References(id.Digest()) { 62 if _, ok := r.(reference.NamedTagged); ok { 63 tags = append(tags, reference.FamiliarString(r)) 64 } 65 } 66 67 h.Tags = tags 68 69 id = histImg.Parent 70 if id == "" { 71 break 72 } 73 histImg, err = i.GetImage(ctx, id.String(), image.GetImageOpts{}) 74 if err != nil { 75 break 76 } 77 } 78 imageActions.WithValues("history").UpdateSince(start) 79 return history, nil 80 }