image_inspect.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package daemon
  2. import (
  3. "runtime"
  4. "time"
  5. "github.com/docker/distribution/reference"
  6. "github.com/docker/docker/api/types"
  7. "github.com/docker/docker/layer"
  8. "github.com/pkg/errors"
  9. )
  10. // LookupImage looks up an image by name and returns it as an ImageInspect
  11. // structure.
  12. func (daemon *Daemon) LookupImage(name string) (*types.ImageInspect, error) {
  13. img, err := daemon.GetImage(name)
  14. if err != nil {
  15. return nil, errors.Wrapf(err, "no such image: %s", name)
  16. }
  17. // If the image OS isn't set, assume it's the host OS
  18. platform := img.OS
  19. if platform == "" {
  20. platform = runtime.GOOS
  21. }
  22. refs := daemon.referenceStore.References(img.ID().Digest())
  23. repoTags := []string{}
  24. repoDigests := []string{}
  25. for _, ref := range refs {
  26. switch ref.(type) {
  27. case reference.NamedTagged:
  28. repoTags = append(repoTags, reference.FamiliarString(ref))
  29. case reference.Canonical:
  30. repoDigests = append(repoDigests, reference.FamiliarString(ref))
  31. }
  32. }
  33. var size int64
  34. var layerMetadata map[string]string
  35. layerID := img.RootFS.ChainID()
  36. if layerID != "" {
  37. l, err := daemon.stores[platform].layerStore.Get(layerID)
  38. if err != nil {
  39. return nil, err
  40. }
  41. defer layer.ReleaseAndLog(daemon.stores[platform].layerStore, l)
  42. size, err = l.Size()
  43. if err != nil {
  44. return nil, err
  45. }
  46. layerMetadata, err = l.Metadata()
  47. if err != nil {
  48. return nil, err
  49. }
  50. }
  51. comment := img.Comment
  52. if len(comment) == 0 && len(img.History) > 0 {
  53. comment = img.History[len(img.History)-1].Comment
  54. }
  55. lastUpdated, err := daemon.stores[platform].imageStore.GetLastUpdated(img.ID())
  56. if err != nil {
  57. return nil, err
  58. }
  59. imageInspect := &types.ImageInspect{
  60. ID: img.ID().String(),
  61. RepoTags: repoTags,
  62. RepoDigests: repoDigests,
  63. Parent: img.Parent.String(),
  64. Comment: comment,
  65. Created: img.Created.Format(time.RFC3339Nano),
  66. Container: img.Container,
  67. ContainerConfig: &img.ContainerConfig,
  68. DockerVersion: img.DockerVersion,
  69. Author: img.Author,
  70. Config: img.Config,
  71. Architecture: img.Architecture,
  72. Os: platform,
  73. OsVersion: img.OSVersion,
  74. Size: size,
  75. VirtualSize: size, // TODO: field unused, deprecate
  76. RootFS: rootFSToAPIType(img.RootFS),
  77. Metadata: types.ImageMetadata{
  78. LastTagTime: lastUpdated,
  79. },
  80. }
  81. imageInspect.GraphDriver.Name = daemon.GraphDriverName(platform)
  82. imageInspect.GraphDriver.Data = layerMetadata
  83. return imageInspect, nil
  84. }