笔者想通过jenkins实现一个简单的自动化部署,目前我的操作如下
- 在工程文件下面新建了dockerfile文件,通过多阶段构建来利用缓存提高构建速度
- 在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
多阶段构建并不一定能提高构建速度,多阶段的目的更多的是为了降低最终打包的镜像大小。是不是利用了缓存,和阶段构建没什么关系,和Dockerfile的指令有关系。
镜像越小,推送镜像到镜像仓库的时候,速度越快 🙂
可以保留一个历史版本的镜像,缓存就还在,速度会快很多。
还可以尝试下面几个方法:
- 如果镜像中有安装第三方包,可以提前把这些所需要的包,打包成一个基础镜像。然后再构建app镜像的时候,依赖这个基础镜像。
- 减少镜像层数,尽量把多个命令写成一行,让它们作为一个镜像层。
- Dockerfile中,如果指令没有修改,下一次构建的时候会直接使用缓存的镜像层,修改了就会生成新的镜像层。还有就是如果第一行指令变了,后面所有的指令就不会再走缓存。 所以一般情况下固定不变的指令写在上面,会经常变的指令写在下面。
- 可以多尝试构建几次,观察一下每次构建的时候时间花在哪里,然后看情况优化。