如何在docker build期间在yarn / npm安装期间为未更改的package.json缓存node_modules?

时间:2017-08-18 16:29:30

标签: javascript node.js npm dockerfile yarnpkg

我有一个类似于此的节点应用程序的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 install更改后才使用yarn.lock

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

1 个答案:

答案 0 :(得分:0)

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

以下是使用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"]

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

  • 关于源文件更改:
    • 0m34.084s
  • 关于yarn.lock更改:
    • 2m22.774s

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

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

作为yarn.lock文件的内容。