使用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
相关产品推荐
相关产品推荐

