image.go 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package daemon
  2. import (
  3. "fmt"
  4. "runtime"
  5. "github.com/docker/distribution/reference"
  6. "github.com/docker/docker/image"
  7. "github.com/docker/docker/pkg/stringid"
  8. )
  9. // errImageDoesNotExist is error returned when no image can be found for a reference.
  10. type errImageDoesNotExist struct {
  11. ref reference.Reference
  12. }
  13. func (e errImageDoesNotExist) Error() string {
  14. ref := e.ref
  15. if named, ok := ref.(reference.Named); ok {
  16. ref = reference.TagNameOnly(named)
  17. }
  18. return fmt.Sprintf("No such image: %s", reference.FamiliarString(ref))
  19. }
  20. func (e errImageDoesNotExist) NotFound() {}
  21. // GetImageIDAndPlatform returns an image ID and platform corresponding to the image referred to by
  22. // refOrID.
  23. func (daemon *Daemon) GetImageIDAndPlatform(refOrID string) (image.ID, string, error) {
  24. ref, err := reference.ParseAnyReference(refOrID)
  25. if err != nil {
  26. return "", "", validationError{err}
  27. }
  28. namedRef, ok := ref.(reference.Named)
  29. if !ok {
  30. digested, ok := ref.(reference.Digested)
  31. if !ok {
  32. return "", "", errImageDoesNotExist{ref}
  33. }
  34. id := image.IDFromDigest(digested.Digest())
  35. for platform := range daemon.stores {
  36. if _, err = daemon.stores[platform].imageStore.Get(id); err == nil {
  37. return id, platform, nil
  38. }
  39. }
  40. return "", "", errImageDoesNotExist{ref}
  41. }
  42. if digest, err := daemon.referenceStore.Get(namedRef); err == nil {
  43. // Search the image stores to get the platform, defaulting to host OS.
  44. imagePlatform := runtime.GOOS
  45. id := image.IDFromDigest(digest)
  46. for platform := range daemon.stores {
  47. if img, err := daemon.stores[platform].imageStore.Get(id); err == nil {
  48. imagePlatform = img.Platform()
  49. break
  50. }
  51. }
  52. return id, imagePlatform, nil
  53. }
  54. // deprecated: repo:shortid https://github.com/docker/docker/pull/799
  55. if tagged, ok := namedRef.(reference.Tagged); ok {
  56. if tag := tagged.Tag(); stringid.IsShortID(stringid.TruncateID(tag)) {
  57. for platform := range daemon.stores {
  58. if id, err := daemon.stores[platform].imageStore.Search(tag); err == nil {
  59. for _, storeRef := range daemon.referenceStore.References(id.Digest()) {
  60. if storeRef.Name() == namedRef.Name() {
  61. return id, platform, nil
  62. }
  63. }
  64. }
  65. }
  66. }
  67. }
  68. // Search based on ID
  69. for platform := range daemon.stores {
  70. if id, err := daemon.stores[platform].imageStore.Search(refOrID); err == nil {
  71. return id, platform, nil
  72. }
  73. }
  74. return "", "", errImageDoesNotExist{ref}
  75. }
  76. // GetImage returns an image corresponding to the image referred to by refOrID.
  77. func (daemon *Daemon) GetImage(refOrID string) (*image.Image, error) {
  78. imgID, platform, err := daemon.GetImageIDAndPlatform(refOrID)
  79. if err != nil {
  80. return nil, err
  81. }
  82. return daemon.stores[platform].imageStore.Get(imgID)
  83. }