package.json中的所有节点模块在经过小幅更改后都会被重新下载

时间:2016-09-06 20:13:00

标签: node.js docker docker-compose

我有一个带有以下Dockerfile的NodeJS容器

FROM node:6

COPY package.json /tmp/package.json

RUN npm config set registry http://registry.npmjs.org/
RUN cd /tmp && npm install
RUN mkdir -p /app && cp -a /tmp/node_modules /app/

WORKDIR /app

CMD npm run dev

EXPOSE 80

如果package.json在我运行docker-compose build时未被修改,则不会重新安装节点模块,这很好。但是,如果我向package.json添加一个依赖项,似乎我的所有依赖项都是从NPM重新下载的,这会浪费很多时间。这种行为是否打算?

1 个答案:

答案 0 :(得分:3)

这是图层缓存的设计。当您使用与以前相同的输入运行相同的命令时,Docker会找到一个层,您从同一个父项启动并运行相同的命令,并且能够重用该层。当您的输入更改(从COPY命令更改其输入)时,缓存变为无效,并返回到在新节点上构建:6图像。从该图像中,您以前没有下载过的文件都可用。