我有一个Docker镜像,我们称它为frontend.image
Jenkins构建奴隶。Jenkins Docker插件将从该映像启动一个容器,并在该容器内构建工件。这一切都很好。在这种情况下,frontend.image
可使用来构建AngularJs应用。构建此Angular应用程序的一部分是安装应用程序所需的npm软件包。
npm安装这个过程似乎要花费很长时间,似乎3分钟,npm总是每次都安装每个软件包。
因此,我为从属服务器添加了一个卷,它是主机安装的卷,Docker插件每次运行前端容器时都会使用该卷:
执行命令的用户npm install
是jenkins
。npm保留了一个缓存,您可以使用npm config get cache
输出命令来查找/home/jenkins/.npm
这就是为什么将主机卷/slaves/volumes/tsl.frontend:/home/jenkins
安装到Web容器从属服务器的原因。
我使用Jenkins项目构建了Angular应用程序,构建没有问题,安装了许多npm软件包。如果ssh进入我的Docker主机并运行cmd,ls /slaves/volumes/tsl.frontend
我会看到很多npm软件包。这意味着我的从服务器主机卷安装成功。
现在,我再次构建Jenkins项目,即使Docker从属构建容器正在使用卷主机安装,npm也会再次安装每个软件包。我什至可以通过先用cmd docker exec -it <some_clever_random_container_id> bash
然后按cmd su jenkins
然后按cmd 猛击到从属容器中来进行确认,npm cache ls
其中列出了许多已缓存的npm软件包。
因此,即使我的主机安装卷具有权限chmod 777
(因此没有权限问题),我也无法npm install
使用缓存。
在运行Docker从属容器的Jenkins构建中,我运行的第一个cmd npm cache ls
已经列出,并且列出了许多软件包,这是否意味着我的主机卷正在按预期工作并且npm缓存索引的完整性也未损坏?
我尝试了常规的npm install
cmd,当我在localhost计算机上运行时,它会第一次安装所有软件包,而下次则几乎没有软件包。以及npm --cache-min 9999999 install
从此SO答案以及cmd中获取的npm缓存“ hack”npm --skip-installed --cache-min 9999999 install
一个相关的问题发布在StackOverflow上。
npm cache ls
和raw ls ~/.npm/* -al
,只是为了确保启动构建时容器的状态。