Docker使用哪种算法来使缓存无效?

时间:2018-11-12 12:34:00

标签: docker

为了减少在动态配置的EC2盒上的Docker映像构建时间,我决定使用以下方法: -每晚在主主机上运行“ docker-compose build” -将整个/ var / lib / docker目录从主主机克隆到新框 -在新框中运行“ docker-compose build”;如果未修改相关文件,则构建应使用缓存。   但是-实际上Docker不使用缓存。我注意到新主机上的构建过程为同一文件生成了不同的哈希值(我的意思是-对于具有相同内容的文件)。

在这篇文章https://hackernoon.com/working-with-the-docker-build-cache-to-autoscale-our-jenkins-nodes-37b63a3dd2a中,不同的mtime是docker缓存失效的解释。 但据我测试,mtime不会影响Docker构建产生的哈希值。 我缺少什么?

感谢,维塔利

我在Ubuntu 16.04上使用Docker版本18.06.1-ce和docker-compose版本1.23.1。

1 个答案:

答案 0 :(得分:2)

我相信docker使用tarsum spec计算文件的校验和。其中包括following headers

  • “名称”-字符串
  • 'mode'-以10为基数的整数的字符串
  • 'uid'-整数字符串
  • 'gid'-整数字符串
  • 'size'-整数字符串
  • 'mtime'(仅适用于版本0)-自1970-01-01 00:00:00 UTC以来的秒数的整数字符串
  • 'typeflag'-字符的字符串
  • “链接名”-字符串
  • 'uname'-字符串
  • 'gname'-字符串
  • 'devmajor'-整数的字符串
  • 'devminor'-整数字符串

我将重点关注的字段包括文件名(应区分大小写),文件权限(模式),所有者(uid / gid)和大小。

还请注意,mtime字段是特定于版本的,因此,如果您最初是在较旧版本的docker上构建映像,则可以将mtime包括在计算中。