github.com/docker/docker@v299999999.0.0-20200612211812-aaf470eca7b5+incompatible/builder/dockerfile/imageprobe.go (about)

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