| package dockerfile |
| |
| import ( |
| "github.com/docker/docker/api/types/container" |
| "github.com/docker/docker/builder" |
| "github.com/sirupsen/logrus" |
| ) |
| |
| // ImageProber exposes an Image cache to the Builder. It supports resetting a |
| // cache. |
| type ImageProber interface { |
| Reset() |
| Probe(parentID string, runConfig *container.Config) (string, error) |
| } |
| |
| type imageProber struct { |
| cache builder.ImageCache |
| reset func() builder.ImageCache |
| cacheBusted bool |
| } |
| |
| func newImageProber(cacheBuilder builder.ImageCacheBuilder, cacheFrom []string, platform string, noCache bool) ImageProber { |
| if noCache { |
| return &nopProber{} |
| } |
| |
| reset := func() builder.ImageCache { |
| return cacheBuilder.MakeImageCache(cacheFrom, platform) |
| } |
| return &imageProber{cache: reset(), reset: reset} |
| } |
| |
| func (c *imageProber) Reset() { |
| c.cache = c.reset() |
| c.cacheBusted = false |
| } |
| |
| // Probe checks if cache match can be found for current build instruction. |
| // It returns the cachedID if there is a hit, and the empty string on miss |
| func (c *imageProber) Probe(parentID string, runConfig *container.Config) (string, error) { |
| if c.cacheBusted { |
| return "", nil |
| } |
| cacheID, err := c.cache.GetCache(parentID, runConfig) |
| if err != nil { |
| return "", err |
| } |
| if len(cacheID) == 0 { |
| logrus.Debugf("[BUILDER] Cache miss: %s", runConfig.Cmd) |
| c.cacheBusted = true |
| return "", nil |
| } |
| logrus.Debugf("[BUILDER] Use cached version: %s", runConfig.Cmd) |
| return cacheID, nil |
| } |
| |
| type nopProber struct{} |
| |
| func (c *nopProber) Reset() {} |
| |
| func (c *nopProber) Probe(_ string, _ *container.Config) (string, error) { |
| return "", nil |
| } |