如何在 docker 构建期间的 yarn / npm 安装期间为未更改的 package.json 缓存node_mo



我有一个节点应用程序的Dockerfile,如下所示:

FROM node:8.3
ENV TERM=xterm-color NPM_CONFIG_LOGLEVEL=warn PATH="$PATH:/usr/src/app/node_modules/.bin/"
WORKDIR /usr/src/app
ADD . /usr/src/app
RUN yarn install --frozen-lockfile --ignore-platform --ignore-engines --quiet && tsc && webpack
CMD ["node", "/usr/src/app/server"]

然而,这意味着在每次更改源代码树时,带有RUN yarn install ...的层都将失效并再次运行。

由于纱线安装本身需要大约 80 年代,因此即使只更换Readme.md,构建速度也会不必要地减慢。

我想只在 package.json 或yarn.lock更改后使用运行yarn install

这个问题也适用于 npm 及其包装

您可以缓存 package.json 和相应的锁定文件,并在临时文件夹中运行安装。添加源后,您可以将node_modules和文件mv到主应用程序文件夹中。

下面是使用yarn install的示例。

FROM node:8.3
ENV TERM=xterm-color NPM_CONFIG_LOGLEVEL=warn PATH="$PATH:/usr/src/app/node_modules/.bin/"
VOLUME ["/logs"]
WORKDIR /tmp/node
ADD package.json yarn.lock ./
RUN yarn install --frozen-lockfile --ignore-platform --ignore-engines --quiet
WORKDIR /usr/src/app
ADD . /usr/src/app
RUN mv /tmp/node/* ./ && tsc && webpack
CMD ["node", "/usr/src/app/server"]

使用timedocker build .上调整后的 Dockerfile 返回这些输出的快速指标:

  • 在源文件更改时:
    • 0米34.084秒
  • 关于纱线锁更改:
    • 2分22.774秒

对于 npm,根据您的版本,您需要添加

  • npm-shrinkwrap.json
  • package-lock.json

代替yarn.lock文件。

最新更新