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

使用pnpm Workspaces的TypeScript MERN单体仓库容器化报错求助

问题:MERN单体仓库Docker构建时出现ERR_PNPM_WORKSPACE_PKG_NOT_FOUND错误

用TypeScript开发的MERN单体仓库项目,目录包含api、client两个应用及shared共享库,前后端均依赖shared库。给每个工作区编写Dockerfile并通过docker-compose构建容器时,触发ERR_PNPM_WORKSPACE_PKG_NOT_FOUND错误,提示找不到@cybersec/shared工作区包。

项目结构

my-monorepo/
|-- api/
|   |-- src/
|   |-- package.json
|   |-- tsconfig.json
|  
|
|-- client/
|   |-- src/
|   |-- package.json
|   |-- tsconfig.json
|   
|
|-- shared/
|   |-- src/
|   |-- package.json
|   |-- tsconfig.json
|
|-- package.json
|-- pnpm-lock.yaml
|-- pnpm-workspace.yaml
|-- tsconfig.base.json

错误信息

> [api 5/7] RUN pnpm install:
2.649  ERR_PNPM_WORKSPACE_PKG_NOT_FOUND  In : "@cybersec/shared@workspace:*" is in the dependencies but no package named "@cybersec/shared" is present in the workspace
2.649
2.649 This error happened while installing a direct dependency of /usr/src/app
2.649
2.649 Packages found in the workspace:
------
failed to solve: process "/bin/sh -c pnpm install" did not complete successfully: exit code: 1

相关配置文件

/api/Dockerfile

# Use a Node.js 18 base image
FROM node:18-alpine

# Set working directory
WORKDIR /usr/src/app

# Copy package.json and package-lock.json
COPY package.json ./

# Install dependencies
RUN npm install -g pnpm
RUN pnpm install

# Copy source code
COPY src ./src

# Build TypeScript
RUN npm run build

# Expose the port your app will run on
EXPOSE 3000

# Command to run your application
CMD ["npm", "start"]

/client/Dockerfile

# Use a Node.js base image
FROM node:18-alpine

# Set working directory
WORKDIR /usr/src/app

# Copy package.json and package-lock.json
COPY package.json ./

# Install dependencies
RUN npm install -g pnpm
RUN pnpm install

# Copy source code
COPY src ./src

# Build TypeScript and React app
RUN npm run build

# Expose the port your app will run on
EXPOSE 3000

# Command to run your application
CMD ["npm", "start"]

docker-compose.yml

version: '3'

services:
  api:
    build:
      context: ./api
    container_name: api
    ports:
      - "3000:3000"
    networks:
      - project-network
    stdin_open: true
    tty: true
    depends_on:
      - shared
      - db

  web:
    container_name: web
    build:
      context: ./client
    ports:
      - "3001:3000"
    networks:
      - project-network
    stdin_open: true
    tty: true
    depends_on:
      - shared
      - api

  shared:
    build:
      context: ./shared

  db:
    image: mongo
    networks:
      - project-network
    container_name: mongo-db
    volumes:
      - ./data/db:/data/db
    ports:
      - 27017:27017

networks:
  project-network:
    driver: bridge
解决方案

问题核心是当前Dockerfile仅复制单个工作区的package.json,但pnpm工作区需要根目录的pnpm-workspace.yaml、根package.json及其他工作区的包定义,才能解析workspace:*类型的依赖。此外,原配置中的shared服务无实际作用,仅构建未被其他服务引用。

1. 调整Dockerfile,基于项目根目录构建

修改api和client的Dockerfile,将构建上下文切换到项目根目录,复制必要的工作区文件:

修改后的/api/Dockerfile

FROM node:18-alpine

WORKDIR /usr/src/app

# 复制根目录pnpm配置及所有工作区的package.json
COPY pnpm-workspace.yaml pnpm-lock.yaml package.json ./
COPY api/package.json ./api/
COPY shared/package.json ./shared/

RUN npm install -g pnpm
# 安装所有依赖(含工作区包)
RUN pnpm install

# 复制源码
COPY api/src ./api/src
COPY shared/src ./shared/src

# 先构建shared库,再构建api
RUN pnpm --filter @cybersec/shared build
RUN pnpm --filter @cybersec/api build

WORKDIR /usr/src/app/api
EXPOSE 3000
CMD ["npm", "start"]

修改后的/client/Dockerfile

FROM node:18-alpine

WORKDIR /usr/src/app

# 复制根目录pnpm配置及所有工作区的package.json
COPY pnpm-workspace.yaml pnpm-lock.yaml package.json ./
COPY client/package.json ./client/
COPY shared/package.json ./shared/

RUN npm install -g pnpm
RUN pnpm install

# 复制源码
COPY client/src ./client/src
COPY shared/src ./shared/src

# 先构建shared库,再构建client
RUN pnpm --filter @cybersec/shared build
RUN pnpm --filter @cybersec/client build

WORKDIR /usr/src/app/client
EXPOSE 3000
CMD ["npm", "start"]

2. 更新docker-compose.yml

移除无用的shared服务,调整api和web服务的构建上下文为项目根目录,并指定Dockerfile路径:

version: '3'

services:
  api:
    build:
      context: .
      dockerfile: ./api/Dockerfile
    container_name: api
    ports:
      - "3000:3000"
    networks:
      - project-network
    stdin_open: true
    tty: true
    depends_on:
      - db

  web:
    container_name: web
    build:
      context: .
      dockerfile: ./client/Dockerfile
    ports:
      - "3001:3000"
    networks:
      - project-network
    stdin_open: true
    tty: true
    depends_on:
      - api
      - db

  db:
    image: mongo
    networks:
      - project-network
    container_name: mongo-db
    volumes:
      - ./data/db:/data/db
    ports:
      - 27017:27017

networks:
  project-network:
    driver: bridge

3. 确认pnpm-workspace.yaml配置正确

确保根目录的pnpm-workspace.yaml包含所有工作区:

packages:
  - 'api'
  - 'client'
  - 'shared'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 22:37:53