node.js - 在 docker 中保持 node_modules 最新

标签 node.js docker docker-compose dockerfile node-modules

我正在与一个团队合作开发一个用 Docker 和 Node.js 构建的代码库。当其他人安装 Node 包时,我 git pull 将这些更改更改为 package.jsonpackage-lock.json

不过,我不能只运行 docker-compose build 然后运行 ​​docker-compose up 来安装这些新的 Node 包。我必须先 docker-compose down -v。这是因为我们使用卷来存储 Node 模块。我们不受此约束,坦率地说,我们宁愿将模块存储在 docker 镜像层中。但是,当我们绑定(bind)应用程序卷(docker-compose.yml 中的-.:/app)时,图像中的node_modules 文件夹被遮蔽了。

感觉我们对此采取了错误的方法,但这似乎是普遍接受的做法。我们的设置基于“Lessons from Building a Node App in Docker

我们的 Dockerfile:

FROM node:8.4.0
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install --loglevel=error --progess=false
COPY . /app/

我们的docker-compose.yml:

---
version: '2.1'

services:
  main:
    build:
      context: .
    volumes:
      - .:/app
      - /app/node_modules
    container_name: main
    command: ['node', 'index.js']

我对这个问题的理解是,在 docker-compose.yml 文件中,卷 -/app/node_modules 创建了一个 copies Node 模块从图像层内部变成一个卷,这意味着当我们使用不同的 package.json 再次构建应用程序时,图像会更新,但不会更新卷。 down 卷会强制它从更新的图像 node_modules 重新复制,这就是它起作用的原因。如果我的理解不正确,请告诉我:)

我们在 AWS ECS 中运行,因此很遗憾,我们只能使用 17.03.2-ce 中可用的 docker 功能(目前没有多阶段 docker 文件)。

最佳答案

看起来您将当前文件夹映射到容器中的/app。如果 ./node_modules 存在于当前文件夹中,我会在执行 docker-compose 之前将其删除。

关于node.js - 在 docker 中保持 node_modules 最新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46916101/

相关文章:

javascript - Webpack 没有捆绑 SCSS/CSS

node.js - PM2 或任何 npm 模块在安装开始时卡住

amazon-web-services - 如何在 Jenkins 中将 Docker 镜像推送到 ECR?

mysql - Gradle 连接到 Docker-Container 中的 MySql 失败

docker - 容器中的Docker-compose scale命令

amazon-web-services - 如何让 docker compose 使用现有的 AWS 子网

reactjs - 在使用 docker 的 create-react-app 生产中使用不同 API URL 的最佳方法是什么?

Docker - 将多个图像发送到注册表

node.js - 使用 Stylus 和 CoffeeScript 中间件是否会降低 Node.js Express 应用程序的速度?

node.js - Mongoose - 已弃用 mongodb@2.2.16 : Please upgrade to 2. 2.19 或更高版本?