imageprobe.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package dockerfile
  2. import (
  3. "github.com/docker/docker/api/types/container"
  4. "github.com/docker/docker/builder"
  5. "github.com/sirupsen/logrus"
  6. )
  7. // ImageProber exposes an Image cache to the Builder. It supports resetting a
  8. // cache.
  9. type ImageProber interface {
  10. Reset()
  11. Probe(parentID string, runConfig *container.Config) (string, error)
  12. }
  13. type imageProber struct {
  14. cache builder.ImageCache
  15. reset func() builder.ImageCache
  16. cacheBusted bool
  17. }
  18. func newImageProber(cacheBuilder builder.ImageCacheBuilder, cacheFrom []string, platform string, noCache bool) ImageProber {
  19. if noCache {
  20. return &nopProber{}
  21. }
  22. reset := func() builder.ImageCache {
  23. return cacheBuilder.MakeImageCache(cacheFrom, platform)
  24. }
  25. return &imageProber{cache: reset(), reset: reset}
  26. }
  27. func (c *imageProber) Reset() {
  28. c.cache = c.reset()
  29. c.cacheBusted = false
  30. }
  31. // Probe checks if cache match can be found for current build instruction.
  32. // It returns the cachedID if there is a hit, and the empty string on miss
  33. func (c *imageProber) Probe(parentID string, runConfig *container.Config) (string, error) {
  34. if c.cacheBusted {
  35. return "", nil
  36. }
  37. cacheID, err := c.cache.GetCache(parentID, runConfig)
  38. if err != nil {
  39. return "", err
  40. }
  41. if len(cacheID) == 0 {
  42. logrus.Debugf("[BUILDER] Cache miss: %s", runConfig.Cmd)
  43. c.cacheBusted = true
  44. return "", nil
  45. }
  46. logrus.Debugf("[BUILDER] Use cached version: %s", runConfig.Cmd)
  47. return cacheID, nil
  48. }
  49. type nopProber struct{}
  50. func (c *nopProber) Reset() {}
  51. func (c *nopProber) Probe(_ string, _ *container.Config) (string, error) {
  52. return "", nil
  53. }