frontend.image
,我将其用于Jenkins构建从站。 Jenkins Docker插件将从该映像启动一个容器,并在该容器内构建工件。这一切都很好。在这种情况下,frontend.image
用于构建AngularJs应用。构建此Angular应用程序的一部分是安装应用程序所需的npm软件包。npm install这个过程似乎要花费很长时间,似乎需要3分钟,npm总是每次都安装每个软件包。 br />
所以我为从属添加了一个卷,它是一个主机安装的卷,Docker插件每次运行前端容器时都会使用该卷:
执行命令
npm install
的用户是jenkins
。 npm保留了一个缓存,您可以使用命令npm config get cache
找到该缓存,该命令输出/home/jenkins/.npm
这就是为什么我将主机卷
/slaves/volumes/tsl.frontend:/home/jenkins
安装到Web容器从属服务器。我构建了Angular应用程序使用Jenkins项目,构建没有问题,安装了许多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
使用缓存。在我的Jenkins构建中,它启动了Docker从属容器,我运行的第一个cmd是
npm cache ls
和许多软件包已列出,这是否意味着我的主机卷正在按预期工作并且npm缓存索引的完整性也未损坏?我尝试了常规的
npm install
cmd,当我在本地主机上运行时,第一次安装所有软件包,而在下次安装几乎没有软件包。以及从此SO答案中获取的npm缓存“ hack” npm --cache-min 9999999 install
以及cmd npm --skip-installed --cache-min 9999999 install
一个相关的问题发布在StackOverflow上。
#1 楼
我最终通过在npm安装中使用Docker映像层缓存解决了此问题,这意味着我将npm安装从Docker从属映像移到了实际的前端映像中,这是我的最终版本如果package.config没有更改,则在构建之间真正缓存npm安装的Docker文件:
FROM centos:7
MAINTAINER Brian Ogden
# Not currently being used but may come in handy
ARG ENVIRONMENT
ENV NODE_VERSION 6.11.1
RUN yum -y update && \
yum clean all && \
yum -y install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm \
yum -y makecache && \
yum -y install nginx-1.12.0 wget
# Cleanup some default NGINX configuration files we don’t need
RUN rm /etc/nginx/conf.d/default.conf
#############################################
# NodeJs Install
#############################################
#Download NodeJs package
RUN wget -q -O - https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz \
| tar --strip-components=1 -xzf - -C /usr/local
# https://stackoverflow.com/a/35774741/1258525
# use changes to package.json to force Docker not to use the cache
# when we change our application's nodejs dependencies:
COPY ./package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir /app && cp -a /tmp/node_modules /app/
WORKDIR /app
COPY . /app
RUN npm run build-$ENVIRONMENT
RUN cd /app && cp -a dist/* /usr/share/nginx/html
COPY ./docker/conf/frontend.conf /etc/nginx/conf.d/frontend.conf
COPY ./docker/conf/nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx"]
评论
它不能解决问题中描述的问题。这只是另一种缓存方式。你知道原因吗? @布莱恩
–阮
19年5月2日在15:59
@AnNguyen不,我花了很多时间试图使npm缓存正常工作。我建议你用我的解决方案
–布赖恩·奥格登(Brian Ogden)
19年5月2日在22:43
我的情况不同。每次触发构建时,将在k8s上配置一个从属。所以我无法基于docker构建过程进行缓存。我想基于NPM缓存,以便每次配置时都可以将持久卷装入从站
–阮
19年5月3日,3:17
评论
我敢打赌,根据您的描述,缓存索引未存储在〜/ .npm内@Tensibai您不正确,我对此非常确定,该用户是jenkins,因为那是您用另一种方式说的,因为我以jenkins用户身份运行npm cache l并列出了软件包,您说的是npm install是被另一个用户执行
不,我是说索引本身可能存储在其他位置,在/ usr / local或npm安装在其中的任何路径,等等,我不知道。这听起来好像npm好像在缓存中什么都没有,所以我想它没有列出目录,而是基于其他地方的某种索引。
@Tensibai,但cmd npm配置获取缓存会返回/home/jenkins.npm,因为该路径难道不是您确定缓存的位置吗?
缓存的位置是,不强制执行缓存索引的位置完全在同一位置。我将在任何其他构建步骤之前,在构建脚本本身中添加一个npm缓存ls和一个原始ls〜/ .npm / * -al,以确保启动构建时容器的状态。