Docker 镜像的缓存

2018-08-18 17:42:47 +08:00
 wangxiaoaer

docker 镜像每个 RUN 命令都会创建一层缓存:

比如

1 RUN apt-get xx

2 mkdir xx && cd xx

3 RUN make xx

上面的第一行命令装了一大堆依赖,大概 500 多 M,每次 build 都比较耗时。

这个命令会不会创建一个缓存?如果可以,并且如果这行命令一直不变的话,修改后面命令,重新构建的时候会不会利用这个缓存?还是重新 apt 安装?因为根据我自己的测试,好像并没有用到缓存,具体是什么情况?

换句话说 docker 的缓存有么有直接跟 dockerfile 中的命令关联起来?能不能跨 dockefile 利用呢?

4689 次点击
所在节点    问与答
30 条回复
KeatingSmith
2018-08-18 23:32:26 +08:00
@wangxiaoaer

Dockerfile 的每一条命令就是一层镜像。

为了精简容器的体积,建议在构建镜像的时候,不要把业务代码放进去,而是在运行容器的时候,利用 volumne 挂载。
KeatingSmith
2018-08-18 23:36:00 +08:00
apt 在安装会卸载软件的时候,会在 /var/log 下,至少是在这个目录下,生成日志文件,所以,导致每次的 Hash 都不一样。

如果要实现你说的依赖缓存快速构建,可以先将耗时的一些命令打包成镜像 A,然后在 Dockerfile 中 FROM A
Reficul
2018-08-18 23:36:16 +08:00
可以手动把老的镜像 pull 下来,然后 build 的时候指定 cache-from 参数
wangxiaoaer
2018-08-19 07:56:45 +08:00
@KeatingSmith #21 但我看很多项目都是用 cp,用完删掉就行了吧。
wangxiaoaer
2018-08-19 07:57:23 +08:00
@KeatingSmith 22
看 15 楼。
KeatingSmith
2018-08-19 08:25:39 +08:00
@wangxiaoaer

不好意思啊,手机回复的帖子,没看到已经有前人提供了方法。
momocraft
2018-08-19 14:59:18 +08:00
选以前的中间结果大致是基于 (build context, 上一个命令得到的层, 下一个 dockerfile 命令)

不会是什么基于文件的 hash (docker 不可能先验知道 "如果不用 cache 会得到同样 hash" 然后选择用)

除了 dockerfile 有其他东西变化吗? 比如 build context?
wangxiaoaer
2018-08-19 15:37:33 +08:00
上午搜了一大堆资料,经过几次测试感觉自己好像理解了:

1 每一条命令都会对应一个缓存层。

2 build 的时候按照 dockerfile 里面命令的顺序一条一条执行,如果命令不变,同时涉及到的文件无变动,就可能会使用缓存层(如果有的话)。

3 如果某一层缓存失效,会导致下面的缓存同样失效。

……………………

不清楚理解的对不对,请大佬指点。
Havee
2018-08-19 18:00:00 +08:00
从来没有用过 ubuntu 镜像,刚才写了两个简单的 dockerfile,也是直接用缓存的呀

FROM ubuntu
RUN apt-get -y update && apt-get -y install curl


FROM ubuntu
RUN apt-get -y update && apt-get -y install curl
RUN apt-get -y install git


在第二次构建的时候
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM ubuntu
---> 735f80812f90
Step 2/3 : RUN apt-get -y update && apt-get -y install curl
---> Using cache
---> b201fe246f08
Step 3/3 : RUN apt-get -y install git
---> Running in 9ffc294479eb
。。。。。。
楼主要不要抛出完整的 Dockerfile 文件看看?
wangxiaoaer
2018-08-19 18:06:08 +08:00
@Havee 看 28 楼的回复,我之前文件写的有问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/481011

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX