本地运行正常的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_modulesjson-server未全局安装且未通过本地依赖调用
本地运行时,scripts命令会自动识别本地node_modules/.bin下的可执行文件,但容器内直接用json-server命令调用时,系统会优先查找全局路径,如果仅安装在本地依赖中就会报错。
解决:- 在Dockerfile中全局安装json-server:
RUN npm install -g json-server - 或通过本地依赖路径调用:
或直接指定可执行文件路径:CMD ["npx", "json-server", "--watch", "./server/userContactsDb.json", "--port", "4000"]CMD ["./node_modules/.bin/json-server", "--watch", "./server/userContactsDb.json", "--port", "4000"]
- 在Dockerfile中全局安装json-server:
挂载目录覆盖容器内依赖
若Docker Compose的匿名卷挂载路径错误,可能导致容器内正确安装的node_modules被覆盖,无法访问依赖。需确保匿名卷挂载到Dockerfile工作目录下的node_modules。
内容的提问来源于stack exchange,提问作者njouro
相关产品推荐
相关产品推荐

