为什么COPY package * .json ./在COPY之前。 。?

时间:2018-07-26 07:38:12

标签: node.js docker

在此有关Docker的Node.js教程中: https://nodejs.org/en/docs/guides/nodejs-docker-webapp/

COPY package*.json ./的意义是什么?

不是所有内容都用COPY . .复制了吗?

有问题的Dockerfile:

FROM node:8

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN npm install
# If you are building your code for production
# RUN npm install --only=production

# Bundle app source
COPY . .

EXPOSE 8080
CMD [ "npm", "start" ]

2 个答案:

答案 0 :(得分:9)

这是Dockerfile中的一种常见模式(所有语言)。 npm install步骤耗时很长,但是仅在软件包依赖项更改时才需要运行。因此,通常会看到第一步仅安装依赖项,而第二步添加实际的应用程序,因为这使重建容器的过程变得更快。

您是对的,如果您一次构建映像,这本质上是相同的;您最后得到的是相同的文件系统内容。

尽管如此,但是在处理包装时会发生这种情况。您已更改了一些src/*.js文件,但尚未更改package.json。您运行npm test,它看起来不错。现在,您重新运行docker build。 Docker注意到package*.json文件没有更改,因此它使用它初次构建的相同图像层而无需重新运行任何内容,它还跳过了npm install步骤(因为它假定在相同的输入文件系统上运行相同的命令会产生相同的输出文件系统)。因此,这使得 second 构建的运行速度更快。

答案 1 :(得分:0)

通常,软件包或应用程序并不附带所有内容。依赖项,node_modules被忽略。这样做是因为node_modules文件夹(通常)是最大的,因为它包含所有依赖项。

package.json文件包含具有所有依赖项的列表。如果您运行(在package.json所在的目录中):

npm install

npm将在所有依赖项所在的位置创建一个node_modules文件夹。

因此,当您复制package.json并运行npm install时,您可以复制一个应用程序。