image.go 2.0 KB

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