念伱成痴 2024-01-30 23:37 采纳率: 66.7%
浏览 8

nodejs项目使用docker部署失败

nodejs使用thinkjs开发的项目docker-compose部署失败

我在用docker-compose部署一个node.js项目时遇见的无法部署,该项目之前使用pm2直接部署在宿主机是可以正常运行的,项目使用了thinkjs框架,下面的是我的docker-compose文件:

services:  
  node:  
    image: node:18.17.1  
    volumes:  
      - /data/jxxw/node/h5-api/:/data/jxxw/node  
    working_dir: /data/jxxw/node  
    command: npm start
    ports:
      - "8362:8362"

h5-api是我把node项目解压之后的文件夹,执行docker-compose up -d之后发现容器未启动,查看logs获得如下提示:

> jxxw-api@1.0.0 start
> node production.js

node:internal/modules/cjs/loader:1080
  throw err;
  ^

Error: Cannot find module 'thinkjs'
Require stack:
- /data/jxxw/node/production.js
    at Module._resolveFilename (node:internal/modules/cjs/loader:1077:15)
    at Module._load (node:internal/modules/cjs/loader:922:27)
    at Module.require (node:internal/modules/cjs/loader:1143:19)
    at require (node:internal/modules/cjs/helpers:121:18)
    at Object.<anonymous> (/data/jxxw/node/production.js:2:21)
    at Module._compile (node:internal/modules/cjs/loader:1256:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1310:10)
    at Module.load (node:internal/modules/cjs/loader:1119:32)
    at Module._load (node:internal/modules/cjs/loader:960:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ '/data/jxxw/node/production.js' ]
}

Node.js v18.17.1


看提示是未读取到thinkjs的依赖,据node开发同学反馈他的打包流程如下:
1.npm install
2.npm pack
之后就把生成的tgz文件给到我这边,
我尝试过写dockerfile文件解决,如下:

# 使用官方 Node.js 镜像
FROM node:18.17.1
# 设置工作目录
WORKDIR /data/jxxw/node
# 将当前目录下的所有内容都复制到位于 /app 的容器中
COPY . /data/jxxw/node
# 安装项目依赖
RUN npm install
# 暴露端口,供外部访问
EXPOSE 8362

提示install失败:

 => ERROR [4/4] RUN npm install                                                                       1542.3s
------
 > [4/4] RUN npm install:
1542.3 npm ERR! code ECONNREFUSED
1542.3 npm ERR! syscall connect
1542.3 npm ERR! errno ECONNREFUSED
1542.3 npm ERR! FetchError: request to https://registry.npmjs.org/ava failed, reason: connect ECONNREFUSED 104.16.28.34:443
1542.3 npm ERR!     at ClientRequest.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/minipass-fetch/lib/index.js:130:14)
1542.3 npm ERR!     at ClientRequest.emit (node:events:514:28)
1542.3 npm ERR!     at TLSSocket.socketErrorListener (node:_http_client:501:9)
1542.3 npm ERR!     at TLSSocket.emit (node:events:526:35)
1542.3 npm ERR!     at emitErrorNT (node:internal/streams/destroy:151:8)
1542.3 npm ERR!     at emitErrorCloseNT (node:internal/streams/destroy:116:3)
1542.3 npm ERR!     at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
1542.3 npm ERR!  FetchError: request to https://registry.npmjs.org/ava failed, reason: connect ECONNREFUSED 104.16.28.34:443
1542.3 npm ERR!     at ClientRequest.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/minipass-fetch/lib/index.js:130:14)
1542.3 npm ERR!     at ClientRequest.emit (node:events:514:28)
1542.3 npm ERR!     at TLSSocket.socketErrorListener (node:_http_client:501:9)
1542.3 npm ERR!     at TLSSocket.emit (node:events:526:35)
1542.3 npm ERR!     at emitErrorNT (node:internal/streams/destroy:151:8)
1542.3 npm ERR!     at emitErrorCloseNT (node:internal/streams/destroy:116:3)
1542.3 npm ERR!     at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
1542.3 npm ERR!   code: 'ECONNREFUSED',
1542.3 npm ERR!   errno: 'ECONNREFUSED',
1542.3 npm ERR!   syscall: 'connect',
1542.3 npm ERR!   address: '104.16.28.34',
1542.3 npm ERR!   port: 443,
1542.3 npm ERR!   type: 'system',
1542.3 npm ERR!   requiredBy: '.'
1542.3 npm ERR! }
1542.3 npm ERR! 
1542.3 npm ERR! If you are behind a proxy, please make sure that the
1542.3 npm ERR! 'proxy' config is set properly.  See: 'npm help config'
1542.3 
1542.3 npm ERR! A complete log of this run can be found in: /root/.npm/_logs/2024-01-30T14_55_34_130Z-debug-0.log
------
Dockerfile:8
--------------------
   6 |     COPY . /data/jxxw/node
   7 |     # 安装项目依赖
   8 | >>> RUN npm install
   9 |     # 暴露 8000 端口,供外部访问
  10 |     EXPOSE 8362
--------------------
ERROR: failed to solve: process "/bin/sh -c npm install" did not complete successfully: exit code: 1
ERROR: Service 'node' failed to build : Build failed


麻烦指点为何,个人理解是thinkjs没有被正确的install,如果我想只写docker-compose文件不写dockerfile文件应该如何操作

  • 写回答

3条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-01-30 23:39
    关注

    参考通义千问和郭老师的小迷弟雅思莫了-编写提供,主要是为了帮助您快速解决问题,如下回答,您可以参考下,如有问题,评论区留言。

    从错误信息来看,问题出在Docker容器中未能正确安装项目依赖(包括thinkjs模块),导致在启动时找不到相应的模块。基于你的描述,这里有几个可能的问题点和解决方案:

    1. 网络问题: 在使用 docker build 时,出现 ECONNREFUSED 错误,表明容器内无法连接到npm仓库(registry.npmjs.org)。请确保在构建或运行Docker容器时可以正常访问互联网,或者如果在企业内部环境,请配置好代理。

    2. Dockerfile 中安装依赖: 在Dockerfile中尝试先复制项目文件,然后安装依赖。修改Dockerfile如下:

      # ...
      COPY . /data/jxxw/node
      RUN npm config set registry https://registry.npm.taobao.org && \
          npm install --production
      # ...
      

      使用淘宝镜像源加速下载,并添加--production参数仅安装生产环境依赖。

    3. 使用缓存层优化构建: 对于Dockerfile,可以利用缓存层优化构建过程,将npm install放在更早的位置,以避免每次改动代码都要重新安装所有依赖。

    4. docker-compose 配置: 如果你希望只用docker-compose.yml来部署,不写Dockerfile,可以在docker-compose.yml中直接指定构建命令和上下文目录,但这通常用于简单场景。对于需要安装复杂依赖的Node.js应用,推荐还是写一个Dockerfile来控制构建过程。但如果你坚持这样做,可以尝试以下方式(并不推荐):

      version: '3'
      services:
        node:
          image: node:18.17.1
          command: "npm install && npm start"
          volumes:
            - ./h5-api:/data/jxxw/node
          working_dir: /data/jxxw/node
          ports:
            - "8362:8362"
          environment:
            - NODE_ENV=production
          network_mode: "host" # 这样做可能会解决网络问题,但也带来了安全风险
      

      注意:使用 network_mode: "host" 可能会解决网络问题,但这种方式会让容器共享宿主机网络栈,可能带来不必要的安全风险。一般情况下,应尽量避免这种做法,而是通过其他方式解决网络问题。

    总结一下,建议首先检查网络问题,并修复Dockerfile中的安装依赖部分。同时,与开发人员沟通确认是否在tgz包中包含了完整的依赖树,以及正确的启动脚本。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月30日

悬赏问题

  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私