为了减少动态配置的 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不同的时间是对 docker 缓存失效的解释。 但据我测试,mtime 不会影响 Docker 生成的哈希值。 我缺少什么?
谢谢,维塔利
我在 Ubuntu 16.04 上使用 Docker 版本 18.06.1-ce 和 docker-compose 版本 1.23.1。
最佳答案
我相信 docker 使用 tarsum spec 计算文件的校验和.这包括 following headers :
- '名称' - 字符串
- 'mode' - base10 整数字符串
- 'uid' - 整数字符串
- 'gid' - 整数字符串
- 'size' - 整数字符串
- 'mtime'(仅限版本 0)- 自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数整数字符串
- 'typeflag' - 字符的字符串
- '链接名' - 字符串
- 'uname' - 字符串
- 'gname' - 字符串
- 'devmajor' - 整数字符串
- 'devminor' - 整数字符串
我会重点关注的字段包括文件名(应该区分大小写)、文件权限(模式)、所有者(uid/gid)和大小。
另请注意,mtime 字段是特定于版本的,因此如果您最初是在旧版本的 docker 上构建镜像,则 mtime 可以包含在计算中。
关于docker - Docker 使用哪种算法使缓存无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53262318/