我们让Jenkins在ECS内运行。我们正在使用管道进行构建和部署过程。管道使用docker插件来提取具有一些依赖性以进行测试的图像等,然后我们的所有步骤都在这个docker容器中发生。
我们目前的问题是我们的NPM安装大约需要8分钟。我们想加快这个过程。当容器在每个构建结束时被拆除时,生成的node_modules将被丢弃。我考虑过NPM缓存,但是由于docker的性质,这似乎无关紧要,除非我们将依赖项预先安装到docker镜像中(但这几乎是图像大小的三倍)。有没有简单的解决方案可以帮助我们的NPM安装速度?
答案 0 :(得分:1)
您应该使用包缓存,但不能直接缓存node_modules
。而是安装程序包安装程序使用的缓存目录,并且您的安装将快速启动。 Docker通过允许您在容器中挂载目录来实现这一点,该容器在构建中持久存在。
对于yarn
装载~/.cache
或~/.cache/yarn
对于npm
mount ~/.npm
docker run -it -v ~/.npm:/.npm ~/.cache:/.cache /my-app:/my-app testing-image:1.0.0 bash -c 'npm ci && npm test`
注意:我在这里使用npm ci
,始终删除node_modules 并使用package-lock.json
中的确切版本重新安装,所以你获得非常一致的构建。 (在纱线中,这是yarn install --frozen-lockfile
)
答案 1 :(得分:0)
您可以设置Http代理并缓存所有依赖项(*)(**)。
然后使用--build-arg设置 HTTP_PROXY variable:
docker build --build-arg HTTP_PROXY=http://<cache ip>:3128 .
*:这不能提高需要编译的依赖项的性能(即:c / c ++绑定)
**:我使用Squid container来共享缓存配置
答案 2 :(得分:0)
在我的情况下,这是一堆安装在计算机中的公司软件,当我将项目文件夹安装在主机上时,显然是一些防病毒软件分析了容器中的所有node_modules文件,我所做的就是避免在本地安装node_modules。立即从25分钟加速到5分钟。
答案 3 :(得分:0)
我已经解释了我用一个可能的实现 here 做了什么。我没有使用 package-lock.json
而是使用 npm ls
命令来检查 node_modules
文件夹中的更改,以便我可以跳过在绑定安装上重新上传缓存模块的步骤。
@bkucera 的回答通过绑定安装为您指明了正确的方向,通常在容器化环境中最简单的选择是创建一个存储缓存包的卷。这些包可以归档在 tarball 中,这是最常见的选项,或者甚至在必要时进行压缩(.tar
中的文件未压缩)。