8 "github.com/docker/distribution/reference"
9 "github.com/docker/docker/api/types/image"
10 "github.com/docker/docker/layer"
13 // ImageHistory returns a slice of ImageHistory structures for the specified image
14 // name by walking the image lineage.
15 func (daemon *Daemon) ImageHistory(name string) ([]*image.HistoryResponseItem, error) {
17 img, err := daemon.GetImage(name)
22 // If the image OS isn't set, assume it's the host OS
25 platform = runtime.GOOS
28 history := []*image.HistoryResponseItem{}
34 for _, h := range img.History {
38 if len(img.RootFS.DiffIDs) <= layerCounter {
39 return nil, fmt.Errorf("too many non-empty layers in History section")
42 rootFS.Append(img.RootFS.DiffIDs[layerCounter])
43 l, err := daemon.stores[platform].layerStore.Get(rootFS.ChainID())
47 layerSize, err = l.DiffSize()
48 layer.ReleaseAndLog(daemon.stores[platform].layerStore, l)
56 history = append([]*image.HistoryResponseItem{{
58 Created: h.Created.Unix(),
59 CreatedBy: h.CreatedBy,
65 // Fill in image IDs and tags
68 for _, h := range history {
72 for _, r := range daemon.stores[platform].referenceStore.References(id.Digest()) {
73 if _, ok := r.(reference.NamedTagged); ok {
74 tags = append(tags, reference.FamiliarString(r))
84 histImg, err = daemon.GetImage(id.String())
89 imageActions.WithValues("history").UpdateSince(start)