Docker容器运行Node.js应用时无法找到helper模块求助
问题描述
在Windows系统的Docker中使用Linux容器对名为Hub的Node.js微服务进行容器化,该服务依赖本地公共模块authentication和helper,且authentication也依赖helper。构建过程无报错,但运行时提示找不到helper模块,容器内文件已确认正确复制,调整Dockerfile的WORKDIR也无效,直接在本地Node.js环境运行应用完全正常。
错误信息
hub-1 | Error: Cannot find module 'helper' hub-1 | Require stack: hub-1 | - /src/apps/Common/Authentication/index.js hub-1 | - /src/apps/Hub/WS/eventhandler.js hub-1 | - /src/apps/Hub/WS/initws.js hub-1 | - /src/apps/Hub/index.js hub-1 | requireStack: [ hub-1 | '/src/apps/Common/Authentication/index.js', hub-1 | '/src/apps/Hub/WS/eventhandler.js', hub-1 | '/src/apps/Hub/WS/initws.js', hub-1 | '/src/apps/Hub/index.js' hub-1 | ] hub-1 | }
目录结构
Main Folder |- Dockerfile_Hub |- compose.yaml |- apps |- Hub |- ...其他服务 |- Common |- Authentication |- Helper |- ...其他公共模块
package.json配置
Hub的package.json
{ "name": "hub", "version": "1.0.0", "description": "Hub Service", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "dependencies": { "authentication": "file:../Common/Authentication", "axios": "^1.6.8", "config": "file:../Common/Config", "crypto": "^1.0.1", "express": "^4.19.1", "express-session": "^1.18.0", "fs": "^0.0.1-security", "helper": "file:../Common/Helper", "http": "^0.0.1-security", "jsonwebtoken": "^9.0.2", "keycloak-connect": "^24.0.2", "logger": "file:../Common/Logger", "node-jose": "^2.2.0", "socket.io": "^4.7.5", "swagger-jsdoc": "^6.2.8", "swagger-ui-express": "^5.0.0" } }
Authentication的package.json
{ "name": "authentication", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "dependencies": { "config": "file:../Config", "helper": "file:../Helper", "jsonwebtoken": "^9.0.2", "jswt": "^1.4.4", "logger": "file:../Logger" } }
Dockerfile
ARG NODE_VERSION=20.12.0 FROM node:${NODE_VERSION}-alpine ENV NODE_ENV development WORKDIR /usr/src/app RUN mkdir -p /src COPY ./apps/Common /src/apps/Common COPY ./apps/Hub /src/apps/Hub # Download dependencies as a separate step to take advantage of Docker's caching. # Leverage a cache mount to /root/.npm to speed up subsequent builds. # Leverage a bind mounts to package.json and package-lock.json to avoid having to copy them into # into this layer. RUN --mount=type=bind,source=/apps/Hub/package.json,target=package.json \ --mount=type=bind,source=/apps/Hub/package-lock.json,target=package-lock.json \ --mount=type=cache,target=/root/.npm \ npm ci --omit=dev RUN cd /src/apps/Hub && npm install # Run the application as a non-root user. USER node # Expose the port that the application listens on. EXPOSE 8000 # Run the application. CMD node /src/apps/Hub/index.js
Docker Compose配置
version: "3" services: hub: build: context: . dockerfile: Dockerfile_Hub environment: NODE_ENV: development APP_PATH: /src/apps/Hub PINO_LOG_LEVEL: debug ports: - 3000:3000
构建及运行日志
[+] Building 0.0s (0/0) docker:default [+] Building 0.0s (0/0) docker:defaultr reading preface from client //./pipe/docker_engine: file has already been closed [+] Building 3.2s (15/15) FINISHED => [hub internal] load build definition from Dockerfile_Hub => => transferring dockerfile: 1.38kB => [hub] resolve image config for docker.io/docker/dockerfile:1 => CACHED [hub] docker-image://docker.io/docker/dockerfile:1@sha256:a57df69d0ea827fb7266491f2813635de6f17269be881f696fbfdf2d83dda33e => [hub internal] load metadata for docker.io/library/node:20.12.0-alpine => [hub internal] load .dockerignore => => transferring context: 2B => [hub stage-0 1/8] FROM docker.io/library/node:20.12.0-alpine@sha256:ef3f47741e161900ddd07addcaca7e76534a9205e4cd73b2ed091ba339004a75 => [hub internal] load build context => => transferring context: 478.86kB => CACHED [hub stage-0 2/8] WORKDIR /usr/src/app => CACHED [hub stage-0 3/8] RUN mkdir -p /src => CACHED [hub stage-0 4/8] COPY ./apps/Common /src/apps/Common => CACHED [hub stage-0 5/8] COPY ./apps/Hub /src/apps/Hub => CACHED [hub stage-0 6/8] RUN --mount=type=bind,source=/apps/Hub/package.json,target=package.json --mount=type=bind,source=/apps/Hub/package- => CACHED [hub stage-0 7/8] RUN cd /src/apps/Hub && npm install => [hub stage-0 8/8] WORKDIR /src/apps/Hub => [hub] exporting to image => => exporting layers => => writing image sha256:4f2ce3b43d06485ec72da1c107df361e6b0a11d44785beea3baff85ff60170a3 => => naming to docker.io/library/finslice-hub [+] Running 2/2 ✔ Container crazy_rosalind Removed ✔ Container finslice-hub-1 Recreated Attaching to hub-1 hub-1 | node:internal/modules/cjs/loader:1146 hub-1 | throw err; hub-1 | ^ hub-1 | hub-1 | Error: Cannot find module 'helper' hub-1 | Require stack: hub-1 | - /src/apps/Common/Authentication/index.js hub-1 | - /src/apps/Hub/WS/eventhandler.js hub-1 | - /src/apps/Hub/WS/initws.js hub-1 | - /src/apps/Hub/index.js hub-1 | requireStack: [ hub-1 | '/src/apps/Common/Authentication/index.js', hub-1 | '/src/apps/Hub/WS/eventhandler.js', hub-1 | '/src/apps/Hub/WS/initws.js', hub-1 | '/src/apps/Hub/index.js' hub-1 | ] hub-1 | } hub-1 | hub-1 | Node.js v20.12.0 hub-1 exited with code 1
已尝试的无效操作
- 调整Dockerfile最后两行如下,问题依旧:
WORKDIR /src/apps/Hub CMD node index.js
内容的提问来源于stack exchange,提问作者Mario Waltner
相关产品推荐
相关产品推荐

