首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免npm每次通过圆环CI创建码头形象时生成node.js包?

如何避免npm每次通过圆环CI创建码头形象时生成node.js包?
EN

Stack Overflow用户
提问于 2020-07-14 17:08:35
回答 1查看 1.4K关注 0票数 1

我使用Node.Js通过AWS ECS Docker容器来部署Circle CI应用程序。

但是,每次我构建一个新映像时,它都会运行npm build (因为它在我的Dockerfile中),每次都会下载和构建所有的node模块。然后,它将一个新的映像上传到AWS存储库。

由于我的环境保持不变,所以我不希望它每次都构建这些包。那么,您认为Docker是否有可能实际更新现有的映像,而不是每次都用所有模块从头构建一个新映像呢?这通常是一种良好的做法吗?

我在想以下工作流程:

npm build

  • If

  • 检查是否有任何新的节点包,如果是,则运行
  1. ,只需保留旧的node_modules文件夹,不要运行构建,只需更新code
  2. Deploy

这样做最好的方法是什么?

这是我的Dockerfile

代码语言:javascript
复制
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):

代码语言:javascript
复制
workflows:
  version: 2.1
  test:
    jobs:
      - test
      - aws-ecr/build-and-push-image:
          create-repo: true
          no-output-timeout: 10m
          repo: 'stage-instance'
EN

回答 1

Stack Overflow用户

发布于 2020-07-14 17:25:05

COPY . .行之后移动RUN npm install行。

按照Docker层缓存的工作方式,如果它知道它已经运行了,它将跳过重新运行RUN行。因此,考虑到这个Dockerfile片段:

代码语言:javascript
复制
FROM node:12.18.0-alpine
WORKDIR /usr/src/app
COPY package.json package-lock.json* ./
RUN npm install

Docker跟踪其COPY中的文件的散列。当它到达RUN行时,如果到目前为止的图像与以前构建的图像相同,它也将跳过RUN行。

如果您首先拥有COPY . .,那么如果源树中的任何文件都发生了更改,那么它将使之后的所有内容的层缓存失效。如果您只首先复制package.json和锁文件,那么只有当这两个文件中的任何一个发生更改时,npm install才会重新运行。

(CircleCI可能执行或不执行相同的层缓存,但是“安装依赖项,然后在其中复制应用程序”是典型的Docker级优化。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62900397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档