为什么 docker 会创建空的 node_modules 以及如何避免它?

2024-06-25

有一些类似的问题 https://stackoverflow.com/questions/39651908/why-node-modules-is-empty-after-docker-build但他们还没有回答为什么 docker 创建空的node_modules即使 dockerfile 设置为在容器中保存 node_modules ,存储库中的目录仍然存在吗?

我有兴趣知道为什么在主机上创建空目录,因为纱线已经在容器内安装了包node_modules以及如何避免它。

## Dockerfile

FROM node:8.11.4-alpine
RUN apk update && apk add yarn
RUN yarn global add nodemon
WORKDIR /usr/app

COPY package.json yarn.lock /usr/app/
RUN yarn

EXPOSE 3000

## docker-compose.yml

version: "3.2"

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    command: nodemon index.js
    volumes:
      - .:/usr/app
      - /usr/app/node_modules
    ports:
      - "3000:3000"


你是对的,你的镜像构建过程是将节点包安装到node_modules图像中的目录。因此,在构建图像后,图像包含node_modules您可以使用它来运行您的应用程序。

You see node_modules在您的主机上,因为您在 Compose 文件中设置了卷。不过,它的内容比您在其他答案中看到的要多。

发生的事情是你正在映射.:/usr/app在您的第一个卷定义中,这意味着您将主机上的当前目录映射到/usr/app在容器中。

这将覆盖/usr/app镜像中的目录与主机上的当前目录。并且您的主机没有node_modules目录(除非您也在主机上安装了node_modules),因此您的容器将无法使用此映射,因为您已经覆盖了/usr/app并且没有node_modules覆盖中的目录。Node 将抛出找不到节点模块的错误。

接下来的卷映射就解决了这个问题,这实际上是一个常见的 Node 开发设置。您创建一个卷/usr/app/node_modules。请注意,该卷没有主机部分,因此没有:在映射中,这里只有一个目录。这意味着 Docker 将挂载/usr/app/node_modules映像中的目录并将其添加到将主机目录映射到的上一个映射中/usr/app.

因此,在运行的容器中,您将获得主机当前目录中的源代码以及node_modules由于双重映射而来自底层图像。

作为副作用,你会看到一个空的node_modules主机当前目录中的目录。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 docker 会创建空的 node_modules 以及如何避免它? 的相关文章

  • Angular 8 webpack-bundle-analyzer 寻找错误的polyfill 文件

    无论我做什么 构建项目后我都会收到以下错误 Error parsing bundle asset
  • 如何在node.js中找到两个地理点之间的距离?

    如何使用 node js 查找两个地理点 经度和经度的集合 之间的距离 我有使用谷歌地图距离矩阵服务的客户端 JavaScript 代码 我想在服务器端javascript中做同样的事情 在node js router js或datamod
  • 通过条件将 Firebase 云消息传递 (FCM) 发送到多个主题的正确语法是什么

    简而言之 我想使用 Google Cloud Functions 向订阅主题组合的设备发送通知 文档说 主题中的 TopicA 主题中的 TopicB 主题中的 TopicC 我试图做的是 var topicsConditions type
  • 如何删除 node_modules - Windows 中的深层嵌套文件夹

    尝试删除后节点模块创建的目录npm install 源文件名大于文件支持的名称 系统 尝试移动到路径名称较短的位置 或者尝试 在尝试此操作之前重命名为较短的名称 I also tried shift delete and still hav
  • 如何使 Puppeteer 在客户端与 ReactJS 应用程序一起工作

    我对 React 相当陌生 我正在开发一个应用程序 它将拍摄网页的实际屏幕截图 并且该应用程序可以在所拍摄的屏幕截图上绘制和添加涂鸦 我最初使用 html2canvas 和 domToImage 来获取客户端屏幕截图 但它不会完全按照网页中
  • 在Java中控制docker-compose

    我创建了相当多的 docker compose 脚本 这些脚本产生了多个服务 我现在想在JVM中控制docker compose 基本上 我希望能够执行up and down 理想情况下与 p
  • 使用 node.js 和 socket.io 阻止 CORS

    我最近开始学习node js和socket io 我遵循了 socket io 的简单教程 在我的计算机上运行时一切正常 但是 我决定将客户端部分上传到服务器进行测试 这就是问题开始的地方 我想在网络主机上运行聊天客户端 并在我的计算机或其
  • 如何在 Windows 上设置 Node.js 的工作目录?

    我刚刚安装了 Windows 版的 Node js 运行它真的是轻而易举 我想将它用作构建过程的一部分 将多个文件组合在一起 如下所示 settings var FILE ENCODING utf 8 EOL n DIST FILE PAT
  • Kubernetes中使用fluidd读取容器日志时的权限问题

    我对 kubernetes 非常陌生 并且在 GCE 中运行了带有 redis 和 mongodb 的测试应用程序 我想用 Fluentd 抓取我的日志文件并将它们发送到 logz 我使用以下 Fluentd 配置文件 我在本地计算机上测试
  • 如何将缓冲区包装为stream2可读流?

    如何使用stream2接口将node js缓冲区转换为可读流 我已经找到了这个answer https stackoverflow com questions 13230487 converting a buffer into a read
  • 在nodejs中从服务器下载.zip文件

    我正在使用 MEAN 其中我想允许用户从服务器下载 zip 文件 所以基本上我必须做以下事情 从某些数据创建 csv 文件 将该文件存储到某个目录中 将这些文件压缩为 zip 当用户单击该按钮时 应该下载并读取压缩文件 我已经完全达到了1
  • 我如何将我的日志/数据保存到docker中的本地文件系统

    有一个应用程序在 docker 容器内运行 应用程序将日志消息写入本地日志文件 如果 docker 容器停止或崩溃 如何使日志文件持久存在 由于容器是运行时实体 当我停止图像时 我的日志 数据就消失了 谢谢 索汉 您可以使用 docker
  • 在同一个 fd 上多次 createReadStream

    在上一个问题中 https stackoverflow com questions 13932967似乎从 node js 中的文件进行随机访问读取的唯一方法是使用fs createReadStream http nodejs org ap
  • 安装 gulp browserify 总是报错

    我尝试使用以下命令安装 gulp browserify npm install gulp browserify save dev 我已经成功安装了许多其他软件包 例如 gulp autoprefixer gulp concat gulp m
  • Node.js:301 重定向非 www,不带 Express

    对于现有项目 我只想做一个简单的更改 将 www mysite com 重定向到 mysite com 因为 cookie 问题 非 www 版本无法访问 www 上的 cookie 我不想包括快递 我该如何做这个简单的改变 我认为这就是您
  • docker 容器内的 debootstrap

    这是我的问题 我想在 docker 容器内构建一个 chroot 环境 问题是 debootstrap 无法运行 因为它无法在 chroot 中挂载 proc W Failure trying to run chroot var chroo
  • 如何阻止我的 App Engine 应用程序的“appspot.com”?

    我添加了一个自定义域 并将其添加到 App Engine 例如 假设我的自定义域是 example com 我的应用程序由 Node js 提供服务 当我通过 App Engine 部署我的应用程序时 它会向我提供以下地址来访问它 exam
  • Promise链基本问题

    我正在尝试理解 Promise 我创建了一些有效的承诺链 而另一些则无效 我已经取得了进步 但显然缺乏基本概念 例如 以下承诺链不起作用 这是一个愚蠢的例子 但说明了问题 我正在尝试在链中使用 Node 的函数 randomBytes 两次
  • 检查redis是否正在运行->node js

    我只是想知道 在 NodeJS 进程开始时 Redis 是否启动 因此用户会话是否会被存储 这是我目前所拥有的 var session require express session var RedisStore require conne
  • NodeJS 生成用于签名和验证消息的有效 PEM 密钥

    Context 来自关于 Node v10 9 0 的 TLS SSL 的 NodeJS 文档 2018 年 8 月 https nodejs org api tls html tls tls ssl concepts https node

随机推荐