我有一个Docker映像,我们称其为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上。

评论

我敢打赌,根据您的描述,缓存索引未存储在〜/ .npm内

@Tensibai您不正确,我对此非常确定,该用户是jenkins,因为那是您用另一种方式说的,因为我以jenkins用户身份运行npm cache l并列出了软件包,您说的是npm install是被另一个用户执行

不,我是说索引本身可能存储在其他位置,在/ usr / local或npm安装在其中的任何路径,等等,我不知道。这听起来好像npm好像在缓存中什么都没有,所以我想它没有列出目录,而是基于其他地方的某种索引。

@Tensibai,但cmd npm配置获取缓存会返回/home/jenkins.npm,因为该路径难道不是您确定缓存的位置吗?

缓存的位置是,不强制执行缓存索引的位置完全在同一位置。我将在任何其他构建步骤之前,在构建脚本本身中添加一个npm缓存ls和一个原始ls〜/ .npm / * -al,以确保启动构建时容器的状态。

#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

#2 楼

您可以执行的另一种方法是设置一个nexus存储库服务器,在其中托管npm模块并代理外部模块。它不会利用缓存,但是由于资源位于您的本地网络内或可能位于同一群中,因此它不需要那么长时间。