Docker-compose:npm 安装成功后卷中不存在 node_modules

2024-05-12

我有一个具有以下服务的应用程序:

  • web/- 在端口 5000 上保存并运行 python 3 Flask Web 服务器。使用 sqlite3。
  • worker/- 有一个index.js文件是队列的工作人员。 Web 服务器通过端口使用 json API 与此队列交互9730。 Worker使用redis进行存储。 Worker 还将数据本地存储在文件夹中worker/images/

现在这个问题只涉及worker.

worker/Dockerfile

FROM node:0.12

WORKDIR /worker

COPY package.json /worker/
RUN npm install

COPY . /worker/

docker-compose.yml

redis:
    image: redis
worker:
    build: ./worker
    command: npm start
    ports:
        - "9730:9730"
    volumes:
        - worker/:/worker/
    links:
        - redis

当我跑步时docker-compose build,一切都按预期进行,所有 npm 模块都安装在/worker/node_modules正如我所期望的。

npm WARN package.json [email protected] /cdn-cgi/l/email-protection No README data

> [email protected] /cdn-cgi/l/email-protection install /worker/node_modules/pageres/node_modules/screenshot-stream/node_modules/phantom-bridge/node_modules/phantomjs
> node install.js

<snip>

但当我这样做时docker-compose up,我看到这个错误:

worker_1 | Error: Cannot find module 'async'
worker_1 |     at Function.Module._resolveFilename (module.js:336:15)
worker_1 |     at Function.Module._load (module.js:278:25)
worker_1 |     at Module.require (module.js:365:17)
worker_1 |     at require (module.js:384:17)
worker_1 |     at Object.<anonymous> (/worker/index.js:1:75)
worker_1 |     at Module._compile (module.js:460:26)
worker_1 |     at Object.Module._extensions..js (module.js:478:10)
worker_1 |     at Module.load (module.js:355:32)
worker_1 |     at Function.Module._load (module.js:310:12)
worker_1 |     at Function.Module.runMain (module.js:501:10)

结果发现没有任何模块存在于/worker/node_modules(在主机上或在容器中)。

如果在主机上,我npm install,然后一切正常。但我不想那样做。我希望容器能够处理依赖关系。

这里出了什么问题?

(不用说,所有的包都在package.json.)


发生这种情况是因为您添加了worker目录作为卷到您的docker-compose.yml,因为在构建期间未安装该卷。

当docker构建镜像时,node_modules目录是在worker目录,所有依赖项都安装在那里。然后在运行时worker来自 docker 外部的目录被安装到 docker 实例中(该实例没有安装node_modules),隐藏node_modules你刚刚安装。您可以通过从您的系统中删除已安装的卷来验证这一点docker-compose.yml.

解决方法是使用数据卷来存储所有node_modules,因为数据卷在之前从构建的 docker 镜像中复制数据worker目录已挂载。这可以在docker-compose.yml像这样:

redis:
    image: redis
worker:
    build: ./worker
    command: npm start
    ports:
        - "9730:9730"
    volumes:
        - ./worker/:/worker/
        - /worker/node_modules
    links:
        - redis

我不完全确定这是否会给图像的可移植性带来任何问题,但由于您似乎主要使用 docker 来提供运行时环境,因此这不应该是问题。

如果您想了解有关卷的更多信息,这里有一个很好的用户指南:https://docs.docker.com/userguide/dockervolumes/ https://docs.docker.com/userguide/dockervolumes/

编辑:Docker 此后更改了它的语法以需要前导./用于安装在与 docker-compose.yml 文件相关的文件中。

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

Docker-compose:npm 安装成功后卷中不存在 node_modules 的相关文章

  • Docker 警告:无法从守护进程获取默认注册表端点

    在 Windows 10 上 当我调用 docker 命令时 docker pull mongo windowsservercore 我得到以下输出 Warning failed to get default registry endpoi
  • 如何修复超出最大调用堆栈大小

    有一个 MERN Firebase 应用程序并收到此错误和一堆 atdeepExtend deepCopy ts 71 RangeError Maximum call stack size exceeded getApps as apps
  • Express.js Passport认证自动失败跳过策略

    UPDATE 我已将代码从护照本地注册内部移至单独的处理程序 并且运行良好 问题在于 Passport 和本地注册的使用 但我不知道为什么 我使用 Node js Express Passport 进行身份验证和注册设置 这是以前使用过的标
  • 为什么changeResourceRecordSets没有被授权访问此资源?

    我正在尝试在 Route 53 中创建一条别名类型的新记录 以告诉 Route 53 起诉 CloudFront 来为该站点提供服务 我正在尝试使用以下代码来执行此操作 let options ChangeBatch Changes Act
  • 如何在 Node JS 应用程序中顺序启动两个命令

    我使用 mocha chai 为我的 Node js 应用程序编写了一些单元测试 我想通过package json文件的scripts属性依次启动node JS服务器和测试套件 我的节点版本是6 9 4 我的 package json 中的
  • 如何使用 Passport /Facebook 策略/验证 Supertest 请求?

    我使用 Passport js 进行身份验证 Facebook 策略 并使用 Mocha 和 Supertest 进行测试 如何使用 Supertest for Facebook 策略创建会话并发出经过身份验证的请求 这是用户未登录时的示例
  • 如何在 Sequelize 现有模型中添加列?

    我使用此命令添加了模型和迁移文件 node modules bin sequelize model generate name User attributes firstName string lastName string email s
  • MongooseError:操作 `orders.deleteMany()` 缓冲在 10000 毫秒后超时

    当我运行我的应用程序时npm run seeder然后我面临这个错误 我仔细检查了我的数据库连接 没问题 另外 我检查了我的 ordermodels 文件也没有问题 我用过MongoDB的compass没有任何问题 我不知道为什么显示buf
  • checkmarx - 如何解决存储的绝对路径遍历问题?

    Checkmarx v 9 3 0 HF11 我将 env 值作为 dev uat 服务器中使用的 docker 文件中的数据目录路径传递 ENV DATA app data 在本地 使用以下环境变量 数据 C 项目 应用程序 数据 get
  • npm install 的问题(Angular)

    今天我尝试创建一个新项目 所以我使用这个命令 ng new NAME style less 并在我的cmder中弹出错误和警告 所以我卸载了 Roaming npm 和 npm cache 中的节点和文件 然后我安装了node并再次下载cm
  • 在node.js 0.12.x中使用libuv函数

    我写了一个node js c 插件 在node js 0 10 x下可以成功编译 但是当迁移到0 12 x时 出现了一些错误 例如error C2065 uv work t undeclared identifier 我想知道我是否可以在0
  • socket.io xhr 在连接缓慢时出现错误(3G 移动网络)

    当我在 3G 移动网络 互联网连接速度慢 上测试我的真实聊天应用程序时 Socket io反复断开然后重新连接 我已经记录了原因 它说 xhr post error 这提高了 transport error 然后断开连接 我可以知道什么意思
  • 是否可以直接获取 Puppeteer 音频源和/或输入音频到 Puppeteer?

    我想将 WAV 或 MP3 输入到 puppeteer 作为麦克风 但是在无头模式下应用程序被静音 所以我想知道是否有一种方法可以直接将输入输入到浏览器中 我还想知道是否可以在无头状态下从浏览器获取音频源 和 或录制音频并将其放在文件夹中
  • 多次训练brain.js?

    在第一次训练后 如何将新信息 仅新信息 而不是所有信息 因为这会花费太多性能 训练到我的用 Brain js 制作的神经网络 它有点粗糙 但您可以使用以下结构来实现 如果我们加入 2 个训练数据集 旧数据集与新数据集 然后重新训练keepN
  • 重命名猫鼬中的字段[重复]

    这个问题在这里已经有答案了 我有两个 JSON 对象 每个对象都有一个名字字段 我想将名字重命名为名称 还想使用猫鼬将现有的名字值导入到名称 Schema const mongoose require mongoose const Sche
  • 码头工人。将动态主机 IP 添加到容器上的环境变量

    我有一个非常特殊的场景 包含一些 docker 容器的虚拟机 该容器之一需要知道主机 IP 问题是如果我在容器构建时传递主机 IP 或使用 e在 docker run 命令上 它在容器上保持 静态 始终相同 那一刻 该虚拟机可以位于笔记本电
  • 如何强制 tsc 忽略 node_modules 文件夹?

    我正在使用 tsc 构建任务 不幸的是 我总是从节点模块文件夹中收到相同的错误 Executing task node modules bin tsc cmd watch p tsconfig json lt node modules ty
  • 如何调查 Docker Swarm 模式关闭容器?

    我们在 4 个节点上有 Docker Swarm 模式 17 09 0 ce 我们正在尝试使用以下方式部署 10 项服务docker stack deploy and docker compose yml 每个服务都有所需的内存和内存限制d
  • 在需要时初始化模块

    我有一个模块 里面有一些初始化代码 加载模块时应执行 init 目前我正在这样做 in the module exports init function config do it in main var mod require myModu
  • 如何让 Angular 监视多个库的更改并在需要时重新编译

    这个问题与让 Angular 应用程序监视库更改并进行自我更新 https stackoverflow com questions 60473727 make angular app watch for libraries changes

随机推荐