jenkins + dockerfile构建如何利用docker缓存提升构建速度?

笔者想通过jenkins实现一个简单的自动化部署,目前我的操作如下

  1. 在工程文件下面新建了dockerfile文件,通过多阶段构建来利用缓存提高构建速度
  2. 在jenkins构建时编写了脚本,主要操作就是删除上一次构建的容器和镜像文件,重写构建一个新的镜像和容器

但是有一个问题就是删除了上一次的镜像和容器docker的缓存是不是就是不在了,无法利用缓存来提高构建速度,如果我想利用dockerfile的缓存提高构建速度,应该怎么去实现呢?
这是我的dockerfile文件,主要就是缓存了package.json减少install的时间

FROM node:14-alpine
WORKDIR /project
COPY package*.json /project/
RUN npm install
COPY . /project
RUN npm run build

FROM nginx
COPY --from=0 /project/dist /usr/share/nginx/City
COPY --from=0 /project/default.conf /etc/nginx/conf.d/City.conf
阅读 4.1k
3 个回答

多阶段构建并不一定能提高构建速度,多阶段的目的更多的是为了降低最终打包的镜像大小。是不是利用了缓存,和阶段构建没什么关系,和Dockerfile的指令有关系。

镜像越小,推送镜像到镜像仓库的时候,速度越快 :)

可以保留一个历史版本的镜像,缓存就还在,速度会快很多。

还可以尝试下面几个方法:

  1. 如果镜像中有安装第三方包,可以提前把这些所需要的包,打包成一个基础镜像。然后再构建app镜像的时候,依赖这个基础镜像。
  2. 减少镜像层数,尽量把多个命令写成一行,让它们作为一个镜像层。
  3. Dockerfile中,如果指令没有修改,下一次构建的时候会直接使用缓存的镜像层,修改了就会生成新的镜像层。还有就是如果第一行指令变了,后面所有的指令就不会再走缓存。 所以一般情况下固定不变的指令写在上面,会经常变的指令写在下面。
  4. 可以多尝试构建几次,观察一下每次构建的时候时间花在哪里,然后看情况优化。

Dockerfile目前可以利用构建缓存加速,但是需要你自己把构建缓存给mount过来。

详情参考官方文档: https://docs.docker.com/build/cache/

例:

# ...
RUN --mount=type=cache,target=/root/.npm/ npm install
# ...

注意你必须在同一台机器上执行构建才会用到这个缓存,它的cache存储在/var/tmp/目录下,你无法通过docker system prune命令删除这个构建缓存,你只能自己删除/var/tmp/目录下对应的缓存目录

docker build --cache-from my-image:latest -t my-image:latest .
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题