在 docker 中使 node_modules 保持最新

Posted

技术标签:

【中文标题】在 docker 中使 node_modules 保持最新【英文标题】:Keeping node_modules up to date in docker 【发布时间】:2018-04-05 13:55:23 【问题描述】:

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

不过,我不能只运行docker-compose build 然后运行docker-compose up 来安装这些新的节点包。我必须先docker-compose down -v。这是因为我们使用卷来存储节点模块。我们不依赖于此,坦率地说,我们宁愿将模块存储在 docker 镜像层中。但是,当我们绑定应用程序卷时(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 创建了一个卷,该卷复制 图像层内部的节点模块到一个卷中,这意味着当我们使用不同的package.json 再次构建应用程序,图像已更新,但音量未更新。 downing 卷强制它从更新的图像 node_modules 重新复制,这就是为什么它起作用的原因。如果我的理解不正确,请告诉我:)

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

【问题讨论】:

***.com/questions/43538187/… 的可能骗局,虽然没有答案 也可能相关:***.com/questions/46916101/… 【参考方案1】:

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

【讨论】:

感谢您的回答。所以,当我尝试这个时,node_modules 文件夹会在我当前的(本地)文件夹中再次创建,位于RUN npm install --loglevel=error --progess=false 行。我每次都需要删除 node_modules 文件夹吗? (或者使用 dockerfile 可以做到吗?) 我会尝试添加 RUN rm -rf ./node_modules ||是的,在 RUN npm install 命令行之前。 不幸的是,这不起作用。我认为是因为它正在删除图像中的node_modules 文件夹,但该卷仍然保留着第一次构建时的旧数据副本。

以上是关于在 docker 中使 node_modules 保持最新的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sbt-native-packager 在 Docker 中使二进制文件可执行?

在 Docker 容器中安装 node_modules 并与主机同步

Docker:EACCES:权限被拒绝,mkdir '/app/node_modules/.cache'

在 Docker 映像中复制 /node_modules 不是一个好主意吗?

在 Dockerized Node.js 开发环境中处理 node_modules 的干净实用的方法?

node_modules 上的 docker-compose 卷但为空