Jenkins Docker 构建从属-npm 缓存不起作用

Jenkins Docker 构建从属-npm 缓存不起作用

我有一个 Docker 镜像,我们称之为frontend.image,我将其用于 Jenkins 构建从属。JenkinsDocker 插件将从此镜像启动一个容器并在容器内构建工件。这一切都很顺利。在本例中,用于frontend.image构建 AngularJs 应用程序。构建此 Angular 应用程序的一部分是安装应用程序所需的 npm 包。

这个过程,npm install,看起来需要很长时间,好像是 3 分钟,npm 每次都会安装每个包。

因此我为我的从属添加了一个卷,它是一个主机挂载的卷,Docker 插件每次运行前端容器时都会使用这个卷:

在此处输入图片描述

执行该命令的用户npm installjenkins。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 项目,npm 再次安装每个包,即使 Docker 从属构建容器正在使用卷主机挂载。我甚至可以通过使用 cmd 进入从属容器来确认,docker exec -it <some_clever_random_container_id> bash然后使用 cmd su jenkins,然后使用 cmdnpm cache ls列出许多缓存的 npm 包。 在此处输入图片描述

因此,即使我的主机挂载卷具有权限,chmod 777因此不存在权限问题,但我无法npm install使用缓存。

我尝试过常规的npm installcmd,当我在本地计算机上运行时,它会在第一次安装所有软件包,而下一次几乎不安装任何软件包。还有 npm 缓存“hack” npm --cache-min 9999999 install,取自这个答案以及 cmdnpm --skip-installed --cache-min 9999999 install

答案1

我最终通过使用 Docker 镜像层缓存来解决这个问题,如下所示这个答案

这意味着我将 npm install 从 Docker 从属映像移出并移到实际的前端映像中,这是我的最终 Docker 文件,如果 package.config 没有更改,它会在构建之间真正缓存 npm install:

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"]

相关内容