docker - Dockerizzare un monorepo MERN in Typescript che utilizza gli workspace pnpm
Ho un progetto con la seguente struttura di cartelle, è un monorepo TypeScript che ha due app (client e api) e una libreria condivisa (shared), sia il backend che il frontend dipendono dalla libreria condivisa. E voglio dockerizzare questo progetto.
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
Ho provato a mettere un Dockerfile in tutte le aree di lavoro e usare docker-compose per costruire tutti i container, ma ho ricevuto il seguente errore:
> [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
I file:
/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