我使用Node.Js通过AWS ECS Docker容器来部署Circle CI应用程序。
但是,每次我构建一个新映像时,它都会运行npm build (因为它在我的Dockerfile中),每次都会下载和构建所有的node模块。然后,它将一个新的映像上传到AWS存储库。
由于我的环境保持不变,所以我不希望它每次都构建这些包。那么,您认为Docker是否有可能实际更新现有的映像,而不是每次都用所有模块从头构建一个新映像呢?这通常是一种良好的做法吗?
我在想以下工作流程:
npm build
node_modules文件夹,不要运行构建,只需更新code这样做最好的方法是什么?
这是我的Dockerfile
FROM node:12.18.0-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . .
COPY package.json package-lock.json* ./
RUN npm install
RUN npm install pm2 -g
EXPOSE 3000
CMD [ "pm2-runtime", "ecosystem.config.js"]我的Circle CI工作流(来自./circleci/config.yml):
workflows:
version: 2.1
test:
jobs:
- test
- aws-ecr/build-and-push-image:
create-repo: true
no-output-timeout: 10m
repo: 'stage-instance'发布于 2020-07-14 17:25:05
在COPY . .行之后移动RUN npm install行。
按照Docker层缓存的工作方式,如果它知道它已经运行了,它将跳过重新运行RUN行。因此,考虑到这个Dockerfile片段:
FROM node:12.18.0-alpine
WORKDIR /usr/src/app
COPY package.json package-lock.json* ./
RUN npm installDocker跟踪其COPY中的文件的散列。当它到达RUN行时,如果到目前为止的图像与以前构建的图像相同,它也将跳过RUN行。
如果您首先拥有COPY . .,那么如果源树中的任何文件都发生了更改,那么它将使之后的所有内容的层缓存失效。如果您只首先复制package.json和锁文件,那么只有当这两个文件中的任何一个发生更改时,npm install才会重新运行。
(CircleCI可能执行或不执行相同的层缓存,但是“安装依赖项,然后在其中复制应用程序”是典型的Docker级优化。)
https://stackoverflow.com/questions/62900397
复制相似问题