You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地运行正常的json-server Docker构建失败,提示模块未找到

问题

本地运行json-server命令完全正常,对应的package.json scripts配置如下:

"scripts": {
    "serve-json": "json-server --watch ./server/userContactsDb.json --port 4000"
},

但通过Docker Compose部署React项目时,出现模块未找到错误。相关配置及错误日志如下:

Docker Compose配置

version: '3.9'

services:
  database:
    build:
      context: .
      dockerfile: database.Dockerfile
    volumes:
      - .:/app
      - /app/node_modules
    ports:
      - 4000:4000

database.Dockerfile

FROM node:12.6

WORKDIR /usr/src/app

COPY package.json .

RUN npm install

COPY . . 

EXPOSE 4000

CMD ["json-server", "--watch", "./server/userContactsDb.json", "--port", "4000"]

错误日志

Attaching to bulle-test-project-main-database-1
bulle-test-project-main-database-1  | internal/modules/cjs/loader.js:628
bulle-test-project-main-database-1  |     throw err;
bulle-test-project-main-database-1  |     ^
bulle-test-project-main-database-1  | 
bulle-test-project-main-database-1  | Error: Cannot find module '/usr/src/app/json-server'
bulle-test-project-main-database-1  |     at Function.Module._resolveFilename (internal/modules/cjs/loader.js:625:15)
bulle-test-project-main-database-1  |     at Function.Module._load (internal/modules/cjs/loader.js:527:27)
bulle-test-project-main-database-1  |     at Function.Module.runMain (internal/modules/cjs/loader.js:839:10)

原因分析与解决办法

  • 工作目录与挂载路径不匹配
    Dockerfile设置的工作目录是/usr/src/app,但Docker Compose把本地目录挂载到了/app,导致容器内npm install安装的依赖在/usr/src/app/node_modules,但运行时系统会去/app下查找,自然找不到json-server。
    解决:统一路径,修改Docker Compose的挂载配置:

    volumes:
      - .:/usr/src/app
      - /usr/src/app/node_modules
    
  • json-server未全局安装且未通过本地依赖调用
    本地运行时,scripts命令会自动识别本地node_modules/.bin下的可执行文件,但容器内直接用json-server命令调用时,系统会优先查找全局路径,如果仅安装在本地依赖中就会报错。
    解决:

    1. 在Dockerfile中全局安装json-server:
      RUN npm install -g json-server
      
    2. 或通过本地依赖路径调用:
      CMD ["npx", "json-server", "--watch", "./server/userContactsDb.json", "--port", "4000"]
      
      或直接指定可执行文件路径:
      CMD ["./node_modules/.bin/json-server", "--watch", "./server/userContactsDb.json", "--port", "4000"]
      
  • 挂载目录覆盖容器内依赖
    若Docker Compose的匿名卷挂载路径错误,可能导致容器内正确安装的node_modules被覆盖,无法访问依赖。需确保匿名卷挂载到Dockerfile工作目录下的node_modules。


内容的提问来源于stack exchange,提问作者njouro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:15:51