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

使用docker-compose启动Nest.js后端容器出现依赖缺失问题如何解决

问题核心原因

首先最直接的错误是docker-compose.yml中匿名卷拼写错误:你写的是/usr/src/app/node_module,少了末尾的s,正确应为/usr/src/app/node_modules。
这个错误导致你原本打算保留容器内依赖的匿名卷完全不生效,宿主机当前目录挂载到/usr/src/app时,会直接覆盖镜像构建阶段生成的所有内容,包括你RUN npm install安装的依赖。你本地如果没有装全依赖(或是monorepo结构下子包目录本身就没有独立的node_modules),容器运行时自然会报依赖缺失。
你用docker run启动正常,是因为默认没有加目录挂载,直接使用镜像内已经装好依赖的文件系统,所以不会触发该问题。
另外你使用的yarn workspaces monorepo架构确实也会带来额外影响,当前配置存在多处不兼容yarn workspaces的问题。

排查&解决步骤

  • 修正docker-compose的拼写错误
    把backend服务volumes配置里的/usr/src/app/node_module改成/usr/src/app/node_modules,先保证容器内的依赖不会被宿主机目录覆盖。
  • 适配yarn workspaces monorepo架构
    1. 当前Dockerfile仅拷贝了当前子包的内容,但yarn workspaces的依赖通常会提升到monorepo根目录的node_modules,依赖声明也分散在根package.json和子包package.json中,你需要在构建镜像时把根目录的package.json、yarn.lock、yarnrc.yml等配置文件也拷贝到镜像内对应位置
    2. 不要用npm install安装依赖,换成yarn install,npm不识别yarn workspaces的依赖结构,会导致依赖安装不全
  • 优化冗余配置
    Dockerfile里已经声明了CMD ["npm", "run", "start:dev"],docker-compose里不需要重复写command配置,避免后续维护时两边配置不一致。
    如果要在容器内保留完整monorepo的目录结构,建议调整WORKDIR到项目根目录,再对应挂载宿主机的根目录,同时把所有workspaces下的node_modules都配置匿名卷,避免被宿主机覆盖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:57:03