Node.js项目Docker Compose运行时找不到swagger-ui-express模块
问题描述
我在app.js中引入swagger-ui-express用于项目,代码如下:
const swaggerUI = require("swagger-ui-express"); const YAML = require("yamljs"); const swaggerDocument = YAML.load("./swagger.yaml"); app.use( "/swagger", swaggerUI.serve, swaggerUI.setup(swaggerDocument) );
但使用Docker Compose运行项目时,出现如下错误:
app_back_end | [nodemon] 1.19.4 app_back_end | [nodemon] to restart at any time, enter `rs` app_back_end | [nodemon] watching dir(s): *.* app_back_end | [nodemon] watching extensions: js,mjs,json app_back_end | [nodemon] starting `node --inspect=0.0.0.0 ./bin/www` app_back_end | Debugger listening on ws://0.0.0.0:9229/0442f111-2e23-40db-a162-d67ed53acbc4 app_back_end | For help, see: https://nodejs.org/en/docs/inspector app_back_end | internal/modules/cjs/loader.js:834 app_back_end | throw err; app_back_end | ^ app_back_end | app_back_end | Error: Cannot find module 'swagger-ui-express' app_back_end | Require stack: app_back_end | - /app/app.js app_back_end | - /app/bin/www app_back_end | at Function.Module._resolveFilename (internal/modules/cjs/loader.js:831:15) app_back_end | at Function.Module._resolveFilename (/app/node_modules/module-alias/index.js:49:29) app_back_end | at Function.Module._load (internal/modules/cjs/loader.js:687:27) app_back_end | at Module.require (internal/modules/cjs/loader.js:903:19) app_back_end | at require (internal/modules/cjs/helpers.js:74:18) app_back_end | at Object.<anonymous> (/app/app.js:81:19) app_back_end | at Module._compile (internal/modules/cjs/loader.js:1015:30) app_back_end | at Object.Module._extensions..js (internal/modules/cjs/loader.js:1035:10) app_back_end | at Module.load (internal/modules/cjs/loader.js:879:32) app_back_end | at Function.Module._load (internal/modules/cjs/loader.js:724:14) app_back_end | at Module.require (internal/modules/cjs/loader.js:903:19) app_back_end | at require (internal/modules/cjs/helpers.js:74:18) app_back_end | at Object.<anonymous> (/app/bin/www:7:11) app_back_end | at Module._compile (internal/modules/cjs/loader.js:1015:30) app_back_end | at Object.Module._extensions..js (internal/modules/cjs/loader.js:1035:10) app_back_end | at Module.load (internal/modules/cjs/loader.js:879:32) app_back_end | at Function.Module._load (internal/modules/cjs/loader.js:724:14) app_back_end | at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12) app_back_end | at internal/main/run_main_module.js:17:47 { app_back_end | code: 'MODULE_NOT_FOUND', app_back_end | requireStack: [ '/app/app.js', '/app/bin/www' ] app_back_end | } app_back_end | [nodemon] app crashed - waiting for file changes before starting...
我已通过npm下载swagger-ui-express模块,但仍出现此错误,请问如何解决?
解决方案
- 检查Dockerfile构建步骤:确保Dockerfile中包含依赖安装命令,比如
RUN npm install或RUN yarn install。本地安装的依赖不会自动同步到容器,必须在镜像构建阶段完成安装。 - 排查
.dockerignore配置:如果.dockerignore文件中包含node_modules,构建镜像时会忽略该目录,导致容器内缺少依赖。可临时注释该行,或确保构建时重新安装依赖。 - 调整Docker Compose卷挂载:若使用本地目录挂载到容器,本地
node_modules可能与容器环境(如Linux)不兼容。可将容器内的node_modules排除在挂载之外,在docker-compose.yml中配置:
这样容器会保留自身的volumes: - .:/app - /app/node_modulesnode_modules目录,避免被本地文件覆盖。 - 重新构建镜像:修改Dockerfile或依赖后,执行
docker-compose build重新构建镜像,再启动服务,避免使用旧的镜像缓存。 - 验证容器内依赖状态:进入容器检查依赖是否存在,执行
docker exec -it <容器名称> bash,查看/app/node_modules下是否有swagger-ui-express和yamljs。若缺失,可在容器内临时执行npm install swagger-ui-express yamljs测试,再排查构建流程问题。
内容的提问来源于stack exchange,提问作者roeygol
相关产品推荐
相关产品推荐

