我有一个节点应用程序的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"]
使用time
docker build .
上调整后的 Dockerfile 返回这些输出的快速指标:
- 在源文件更改时:
- 0米34.084秒
- 关于纱线锁更改:
- 2分22.774秒
对于 npm,根据您的版本,您需要添加
npm-shrinkwrap.json
package-lock.json
代替yarn.lock
文件。