package.json中的所有节点模块都会在稍作更改后重新下载

我有一个NodeJS容器与下面的Dockerfile

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 

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

这是图层caching的devise。 当你使用和前面相同的input运行相同的命令时,Docker会find一个从同一父节点开始的层,并运行相同的命令,并且可以重用该层。 当你的input改变时(从COPY命令改变它的input),caching变得无效,并且回到build立在新节点:6图像的顶部。 从该图像中,您以前下载的文件都不可用。