image_inspect.go 2.0 KB

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