克隆git repo时如何从docker镜像缓存中受益

时间:2015-10-08 09:54:08

标签: docker docker-image

我有一个私有的git存储库,我必须添加到我的docker镜像中。为此,我将其与Dockerfile在同一目录中本地克隆,然后使用以下docker命令:

ADD my_repo_clone /usr/src/

我的repo有一个我克隆的版本标记,v1。所以我克隆的文件总是一样的。

问题在于,当我构建这个泊坞窗图像时,我总是得到一个图像而不是替换旧图像:

docker build --rm -t "org_name/image_name" .

显然,因为文件的ctime发生了变化,所以docker缓存看不到我的文件是一样的,所以我总是得到一个新图像,我想避免这种情况。

我尝试touch克隆的回购并将atimemtime更改为固定日期,但仍然不够。

如何停止Docker(不更改计算文件哈希的Docker源代码并重新构建它),不再创建新图像。

或者我如何在图像构建过程中克隆回购? (为此我需要SSH转发,因为repo是私有的,我也不能在映像构建过程中使SSH代理转发工作)

1 个答案:

答案 0 :(得分:0)

由于您不关心存储库本身而只需要标记v1的文件,因此您可以使用git archive代替git clone来生成 tar 存档包含标记v1的文件。

最后,docker ADD指令将存档注入图像。

生成的tar存档的 mtime 将是标记记录的时间:

  

git archive在给定树ID时与给定提交ID或标记ID时的行为不同。在第一种情况下,当前时间用作存档中每个文件的修改时间。在后一种情况下使用引用的提交对象中记录的提交时间

尝试:

git archive --remote=https://my.git.server.com/myoproject.git refs/tags/v1 --format=tar > v1.tar