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

标签 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不同的时间是对 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/

相关文章:

docker - 在构建自己的容器的 Jenkins 管道中获取 "sudo: unknown uid xxx: who are you?"

docker - 在kubernetes部署中将configMap作为参数传递

macos - Boot2Docker 搜索不存在的 docker-bootstrap.sock

docker - 如何在Arch Linux中启用Docker的 “--squash”功能?

.net - 适用于centos 7的Docker设置

Docker:安装 apt-utils 时遇到问题

docker - 什么是 docker 子镜像

c# - 尝试以编程方式运行容器时从 Docker 退出代码 125

docker - 如何更改 docker 默认 ip 绑定(bind)?

python - 在 Jenkins Docker 中升级 Python