image_history.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package daemon
  2. import (
  3. "fmt"
  4. "github.com/docker/docker/layer"
  5. "github.com/docker/docker/reference"
  6. "github.com/docker/engine-api/types"
  7. )
  8. // ImageHistory returns a slice of ImageHistory structures for the specified image
  9. // name by walking the image lineage.
  10. func (daemon *Daemon) ImageHistory(name string) ([]*types.ImageHistory, error) {
  11. img, err := daemon.GetImage(name)
  12. if err != nil {
  13. return nil, err
  14. }
  15. history := []*types.ImageHistory{}
  16. layerCounter := 0
  17. rootFS := *img.RootFS
  18. rootFS.DiffIDs = nil
  19. for _, h := range img.History {
  20. var layerSize int64
  21. if !h.EmptyLayer {
  22. if len(img.RootFS.DiffIDs) <= layerCounter {
  23. return nil, fmt.Errorf("too many non-empty layers in History section")
  24. }
  25. rootFS.Append(img.RootFS.DiffIDs[layerCounter])
  26. l, err := daemon.layerStore.Get(rootFS.ChainID())
  27. if err != nil {
  28. return nil, err
  29. }
  30. layerSize, err = l.DiffSize()
  31. layer.ReleaseAndLog(daemon.layerStore, l)
  32. if err != nil {
  33. return nil, err
  34. }
  35. layerCounter++
  36. }
  37. history = append([]*types.ImageHistory{{
  38. ID: "<missing>",
  39. Created: h.Created.Unix(),
  40. CreatedBy: h.CreatedBy,
  41. Comment: h.Comment,
  42. Size: layerSize,
  43. }}, history...)
  44. }
  45. // Fill in image IDs and tags
  46. histImg := img
  47. id := img.ID()
  48. for _, h := range history {
  49. h.ID = id.String()
  50. var tags []string
  51. for _, r := range daemon.referenceStore.References(id) {
  52. if _, ok := r.(reference.NamedTagged); ok {
  53. tags = append(tags, r.String())
  54. }
  55. }
  56. h.Tags = tags
  57. id = histImg.Parent
  58. if id == "" {
  59. break
  60. }
  61. histImg, err = daemon.GetImage(id.String())
  62. if err != nil {
  63. break
  64. }
  65. }
  66. return history, nil
  67. }