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

ljsrvy3e  于 2022-12-29  发布在  Docker
关注(0)|答案(2)|浏览(244)

在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" ]
g9icjywg

g9icjywg1#

这是Dockerfiles(所有语言)中的常见模式。npm install步骤需要很长时间,但您只需要在包依赖项发生变化时运行它。因此,通常会看到第一步只安装依赖项,第二步添加实际应用程序,因为这会加快容器的重建速度。
你是对的,如果你只构建一次图像,这本质上是相同的;在最后得到的是相同的文件系统内容。
假设这种情况发生在你处理软件包的时候。你已经修改了一些src/*.js文件,但是没有修改package.json。你运行npm test,它看起来很好。现在你重新运行docker build。Docker注意到package*.json文件没有修改,所以它使用第一次构建的同一个图像层,而没有重新运行任何东西。* 并且它还跳过了npm install步骤 *(因为它假设在相同的输入文件系统上运行相同的命令会产生相同的输出文件系统)。

unhi4e5o

unhi4e5o2#

在构建一个图像Docker工程的基础上,基于层的架构,这是每一行你写在一个Dockerfile进入层,并得到缓存...现在,首先复制package*.json文件的目的是在构建映像期间在Dockerfile中进行的一种优化,因为我们希望仅在某些依赖项添加到项目中时才运行命令npm install,因此将第一个包 *.json复制到镜像文件系统中用于每个连续的构建仅当新的依赖性被添加到项目中时才运行NPM安装,然后只是将所有内容复制到镜像文件系统中,然后在Docker是软件的无头PC之后,它不检查层改变之后的层,它只是在之后执行...因此,在将整个主机文件系统复制到镜像文件系统之后,每次都无需运行npm安装即可获得保存

相关问题