in executors/docker/executor_docker.go [338:386]
func (s *executor) addCacheVolume(containerPath string) error {
var err error
containerPath = s.getAbsoluteContainerPath(containerPath)
// disable cache for automatic container cache, but leave it for host volumes (they are shared on purpose)
if s.Config.Docker.DisableCache {
s.Debugln("Container cache for", containerPath, " is disabled.")
return nil
}
hash := md5.Sum([]byte(containerPath))
// use host-based cache
if cacheDir := s.Config.Docker.CacheDir; cacheDir != "" {
hostPath := fmt.Sprintf("%s/%s/%x", cacheDir, s.Build.ProjectUniqueName(), hash)
hostPath, err := filepath.Abs(hostPath)
if err != nil {
return err
}
s.Debugln("Using path", hostPath, "as cache for", containerPath, "...")
s.binds = append(s.binds, fmt.Sprintf("%v:%v", filepath.ToSlash(hostPath), containerPath))
return nil
}
// get existing cache container
var containerID string
containerName := fmt.Sprintf("%s-cache-%x", s.Build.ProjectUniqueName(), hash)
if inspected, err := s.client.ContainerInspect(s.Context, containerName); err == nil {
// check if we have valid cache, if not remove the broken container
if _, ok := inspected.Config.Volumes[containerPath]; !ok {
s.Debugln("Removing broken cache container for ", containerPath, "path")
s.removeContainer(s.Context, inspected.ID)
} else {
containerID = inspected.ID
}
}
// create new cache container for that project
if containerID == "" {
containerID, err = s.createCacheVolume(containerName, containerPath)
if err != nil {
return err
}
}
s.Debugln("Using container", containerID, "as cache", containerPath, "...")
s.volumesFrom = append(s.volumesFrom, containerID)
return nil
}