image.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package daemon
  2. import (
  3. "fmt"
  4. "runtime"
  5. "github.com/docker/distribution/reference"
  6. "github.com/docker/docker/errdefs"
  7. "github.com/docker/docker/image"
  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. // GetImageIDAndOS returns an image ID and operating system corresponding to the image referred to by
  22. // refOrID.
  23. func (daemon *Daemon) GetImageIDAndOS(refOrID string) (image.ID, string, error) {
  24. ref, err := reference.ParseAnyReference(refOrID)
  25. if err != nil {
  26. return "", "", errdefs.InvalidParameter(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 operating system, defaulting to host OS.
  44. imageOS := runtime.GOOS
  45. id := image.IDFromDigest(digest)
  46. for os := range daemon.stores {
  47. if img, err := daemon.stores[os].imageStore.Get(id); err == nil {
  48. imageOS = img.OperatingSystem()
  49. break
  50. }
  51. }
  52. return id, imageOS, nil
  53. }
  54. // Search based on ID
  55. for os := range daemon.stores {
  56. if id, err := daemon.stores[os].imageStore.Search(refOrID); err == nil {
  57. return id, os, nil
  58. }
  59. }
  60. return "", "", errImageDoesNotExist{ref}
  61. }
  62. // GetImage returns an image corresponding to the image referred to by refOrID.
  63. func (daemon *Daemon) GetImage(refOrID string) (*image.Image, error) {
  64. imgID, os, err := daemon.GetImageIDAndOS(refOrID)
  65. if err != nil {
  66. return nil, err
  67. }
  68. return daemon.stores[os].imageStore.Get(imgID)
  69. }