Docker中心图像缓存似乎不起作用

jtm*_*mon 12 docker dockerhub docker-registry

我们在circleci上有一个持续集成管道,它执行以下操作:

  1. 从缓存目录加载repo/image:mytag1,以便能够使用缓存层
  2. 构建新版本:docker build -t repoimage:mytag2
  3. 使用docker save将新版本保存到缓存目录
  4. 运行测试
  5. 推送到docker hub:docker push repo/image:mytag2

问题在于步骤5.每次推送步骤需要5分钟.如果我理解正确,docker hub意味着缓存层,这样我们就不必重新推送基本映像和依赖关系(如果它们没有更新).

我连续两次运行构建,并且在被推送的层的哈希中看到了很多交叉.然而,不是"图像已经存在",我看到"图像成功推动".

是build 1的docker push的输出,这里是build 2

如果您对这两个文件进行区分,您会发现每个构建中只有两个层不同:

< ca44fed88be6: Buffering to Disk
< ca44fed88be6: Image successfully pushed
< 5dbd19bfac8a: Buffering to Disk
< 5dbd19bfac8a: Image successfully pushed
---
> 9136b10cfb72: Buffering to Disk
> 9136b10cfb72: Image successfully pushed
> 0388311b6857: Buffering to Disk
> 0388311b6857: Image successfully pushed
Run Code Online (Sandbox Code Playgroud)

那么为什么所有的图像每次都必须重新推动呢?

msw*_*msw 1

使用不同的标签会创建不同的图像,该图像在推送时不能依赖缓存。

例如这两个命令:

$ docker commit -m "thing" -a "me" db65bf421f96 me/thing:v1
$ docker commit -m "thing" -a "me" db65bf421f96 me/thing:v2
Run Code Online (Sandbox Code Playgroud)

产生完全不同的图像,即使它们是从相同的图像创建的(db65bf421f96)。当推送时,dockerhub 必须将它们视为完全独立的镜像,如下所示:

$ docker images
REPOSITORY     TAG      IMAGE ID
me/thing       v2       f14aa8ac6bae
me/thing       v1       c7d72ccc1d71
Run Code Online (Sandbox Code Playgroud)

图像 ID 是唯一的,因此即使图像的标签不同,它们也是唯一的。

您可以说“docker 应该将它们识别为完全相同”,从而将它们视为可缓存的。但它(还)没有。

在你的例子中,唯一令我惊讶的是你有任何重复的图像ID。

权威的(如果解释性较少的)文档可以在 docker的“构建你自己的镜像”中找到。