使用案例:
我们在 Jenkins 中有几个“发布工作”build
and push
将应用程序的 Docker 镜像复制到 docker 注册表,更新各个文件中的项目版本,最后将发布标签推送到相应的 Git 存储库。
整个过程在一个隔离的内部运行Docker 中的 Docker容器,这意味着每次执行这些 Jenkins 作业时,Docker 缓存都是完全空白的。
简而言之: Jenkins 实例 --> 启动 DinD 容器 --> Git 存储库正在 DinD 容器中克隆 --> 包含多个层的 Dockerfile,包括正在构建的应用程序的实际构建过程 --> 将 docker 镜像推送到注册表 --> > 将版本推送到 Git。
问题:
虽然一方面这种隔离有助于避免一些问题,但另一方面它使整个 docker 构建过程特别慢。
Docker pull 和 docker Push 进程肯定会在一定程度上导致这种延迟,但这是我们无法处理的网络速度问题。
然而,这种迟到的另一个原因是,由于实际的应用程序(maven 或 Angular)是在一个“干净的”docker 容器内构建的,其中.m2 or 节点模块目录每次都是空的,每次运行时都必须下载/安装所有依赖项。显然,我们可以从 Jenkins 在 DinD 容器内安装 .m2 存储库,但在此 DinD 容器内构建的映像将无法访问它。
我们试图tar
.m2 和 node_modules 目录,COPY
它们通过 Dockerfile 位于图像中,untar
他们与move
他们走上了正确的道路,但这种解决方法最多可以节省 1-2 分钟。
我们还尝试使用缓存 Maven 依赖项buildkit
, e.g. https://www.baeldung.com/ops/docker-cache-maven-dependency#caching-using-buildkit https://www.baeldung.com/ops/docker-cache-maven-dependencies#caching-using-buildkit但这显然不完全是我们所需要的。
AFAIK 无法安装卷docker build
,这将是我们“空白缓存”情况下的理想解决方案。
有没有人遇到过类似的问题并找到解决方法?
一般来说,我们将不胜感激任何有关如何最大限度地减少发布作业的执行时间并优化整个流程的建议。
先感谢您。
就像评论中提到的 SiHa 一样,您可以拥有一个内部带有预构建依赖项的映像。我可能会这样做:
以轻量级为例node:16-alpine
图像(对于angular
项目的一部分),从 github 克隆代码(使用depth=1
以加快速度),运行npm install
并将图像推送到您的存储库。在更新依赖项之前,您不必更改此映像。
在您的日常构建中,下载此映像并克隆 github 代码并仅运行npm run build
, since node_modules
文件夹已经在图像内。
使用FROM
将构建的代码复制到您的最终图像。
使用轻量级图像而不是克隆整个存储库应该会大大加快速度,并且使用具有预构建依赖项的图像might比复制/提取映像内的依赖项更快 - 取决于硬件和网络速度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)