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

Jak*_*zyk 10 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" ]
Run Code Online (Sandbox Code Playgroud)

Dav*_*aze 14

这是Dockerfiles中的常见模式(所有语言).该npm install步骤需要很长时间,但您只需在包依赖项更改时运行它.因此,通常会看到只安装依赖项的一个步骤,以及添加实际应用程序的第二步,因为它使重建容器变得更快.

你是对的,如果你要建造一次图像,这基本上是相同的; 最后得到相同的文件系统内容.

但是,当你正在处理包时,就会发生这种情况.你已经改变了一些src/*.js文件,但没有改变package.json.你跑了npm test,看起来不错.现在你重新跑docker build.Docker注意到package*.json文件没有改变,所以它使用了它第一次构建的相同图像层而没有重新运行任何东西,它也跳过了这npm install一步(因为它假设在同一输入文件系统上运行相同的命令产生相同的输出文件系统).所以这使第二次构建运行得更快.

  • 您还应该在“.dockerignore”文件中包含“node_modules”,以便“COPY”步骤不会覆盖刚刚“npm install”的内容。 (6认同)
  • 我认为这是一种捷径,如果“npm install”失败,我们可以避免继续复制应用程序源。 (2认同)
  • 但是,在第一层中创建的“node_modules”目录是否被使用“COPY”复制的下一层中的“node_modules”目录完全覆​​盖。.`命令?此外,理论上主机目录中可能存在更新的模块版本,且“package.json”未更改。 (2认同)