我有一个带有以下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重新下载的,这会浪费很多时间。这种行为是否打算?
答案 0 :(得分:3)
这是图层缓存的设计。当您使用与以前相同的输入运行相同的命令时,Docker会找到一个层,您从同一个父项启动并运行相同的命令,并且能够重用该层。当您的输入更改(从COPY命令更改其输入)时,缓存变为无效,并返回到在新节点上构建:6图像。从该图像中,您以前没有下载过的文件都可用。