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