更新
我改变了这个问题的方向,最后利用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
所以我尝试将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)
答案 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会在每个构建步骤后缓存,从而保存重复获取依赖项。