docker - Dockerizirajte Typescript MERN monorepo koji koristi pnpm workspaces


Imam projekt s sljedećom strukturom mapa, to je TypeScript monorepo koji ima dvije aplikacije (client i api) i zajedničku biblioteku (shared), tako da i backend i frontend ovise o zajedničkoj biblioteci. I želim dockerizirati ovaj projekt.

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

Pokušao sam staviti Dockerfile u sve radne prostore i koristiti docker-compose za izgradnju svih kontejnera, ali dobio sam sljedeću pogrešku:

 > [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

Datoteke:

/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