如何让npm使用缓存

时间:2017-10-25 00:59:27

标签: node.js docker caching npm

更新

我改变了这个问题的方向,最后利用Docker图像层来缓存npm安装,除非package.config,see here发生了变化。

注意,关于这个问题,我仍然在奴隶Jenkins Docker镜像中构建我的AngularJs Docker镜像但是我不再在Docker slave中运行npm install,我将我的app文件复制到我的AngularJs Docker镜像并运行npm安装在AngularJs Docker镜像中,从而获得npm安装的Docker缓存层,灵感来自这个伟大的idea/answer here

------------------------------- END UPDATE -------------- ----------------

好的,我应该添加一个警告,我在Docker容器中,但这真的不太重要,我不会停止容器,我有npm缓存文件夹的卷以及/ home文件夹,用于运行npm命令的用户。

安装了npm的Docker容器的目的是它是一个构建从属,由Jenkins开始构建一个AngularJs应用程序。问题在于每次下载所有必需的npm软件包都非常慢。

jenkins是用户,构建服务器上的jenkins帐户是"其中"正在运行npm install

我为运行npm install cmd:/home/jenkins/.npm的用户提供了npm文件夹卷,以及命令npm config get cache所说的文件夹是我的缓存目录:{{1} }。并不是容器卷应该重要,因为我在运行/root/.npm后没有停止容器。

好的步骤我开始调试,开始,我闯入容器"使用此命令:

npm install

我从这一点开始运行的所有命令我已经安装了npm连接到正在运行的容器。

docker exec -it <container_id> bash 会产生echo "$HOME"

/root会产生npm config get cache

任何时候root/.npm在此容器中运行jenkins,在该命令成功完成后,我运行npm install,它始终为空,没有缓存:npm cache ls

我们可以使用~/.npm查看许多软件包: enter image description here

所以我尝试将cache-min设置为很长的过期时间:ls -a /home/jenkins/.npm/没有帮助。

我不知道还能做什么,似乎没有我的npm软件包被缓存,我如何让npm缓存软件包?

这是一个截断的npm安装输出:

npm config set cache-min 9999999

这是我的Dockerfile:

Downloading binary from https://github.com/sass/node-sass/releases/download/v4.5.3/linux-x64-48_binding.node
Download complete
Binary saved to /home/jenkins/workspace/tsl.frontend.development/node_modules/node-sass/vendor/linux-x64-48/binding.node
Caching binary to /home/jenkins/.npm/node-sass/4.5.3/linux-x64-48_binding.node
Binary found at /home/jenkins/workspace/tsl.frontend.development/node_modules/node-sass/vendor/linux-x64-48/binding.node
Testing binary
Binary is fine
typings WARN deprecated 3/24/2017: "registry:dt/core-js#0.9.7+20161130133742" is deprecated (updated, replaced or removed)
[?25h
+-- app (global)
`-- core-js (global)

1 个答案:

答案 0 :(得分:3)

当您运行import re def test_fruit(my_dict, sentence): return re.search(r'{{(.*)}}', sentence).group(1) in my_dict['fruit'] 时,您将以docker exec -it <container> bash用户身份访问Docker容器。 root因此将缓存保存到npm install,这不是容器保存的卷。另一方面,Jenkins使用/root/.npm用户,该用户保存到正在缓存的jenkins。因此,为了模拟实际Jenkins工作流程的功能,您需要/home/jenkins/.npm才能su jenkins

话虽这么说,npm缓存不是一个完美的解决方案(特别是如果你有大量的自动Jenkins构建)。有些事情需要考虑的是更好的长期解决方案:

  • 安装npm install之类的本地NPM缓存。我发现this guide特别有帮助。

  • 使用Docker构建您的应用程序(使用Docker In Docker可以正常工作)。 Docker会在每个构建步骤后缓存,从而保存重复获取依赖项。