11# Dockerfile for Open Archiver
22
3- # 1. Build Stage: Install all dependencies and build the project
4- FROM node:22-alpine AS build
3+ ARG BASE_IMAGE=node:22-alpine
4+
5+ # 0. Base Stage: Define all common dependencies and setup
6+ FROM ${BASE_IMAGE} AS base
57WORKDIR /app
68
79# Install pnpm
8- RUN npm install -g pnpm
10+ RUN --mount=type=cache,target=/root/.npm \
11+ npm install -g pnpm
912
1013# Copy manifests and lockfile
1114COPY package.json pnpm-workspace.yaml pnpm-lock.yaml* ./
1215COPY packages/backend/package.json ./packages/backend/
1316COPY packages/frontend/package.json ./packages/frontend/
1417COPY packages/types/package.json ./packages/types/
18+
19+ # 1. Build Stage: Install all dependencies and build the project
20+ FROM base AS build
1521COPY packages/frontend/svelte.config.js ./packages/frontend/
1622
1723# Install all dependencies. Use --shamefully-hoist to create a flat node_modules structure
18- RUN pnpm install --shamefully-hoist --frozen-lockfile --prod=false
24+ ENV PNPM_HOME="/pnpm"
25+ RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
26+ pnpm install --shamefully-hoist --frozen-lockfile --prod=false
1927
2028# Copy the rest of the source code
2129COPY . .
@@ -24,17 +32,7 @@ COPY . .
2432RUN pnpm build
2533
2634# 2. Production Stage: Install only production dependencies and copy built artifacts
27- FROM node:22-alpine AS production
28- WORKDIR /app
29-
30- # Install pnpm
31- RUN npm install -g pnpm
32-
33- # Copy manifests and lockfile
34- COPY package.json pnpm-workspace.yaml pnpm-lock.yaml* ./
35- COPY packages/backend/package.json ./packages/backend/
36- COPY packages/frontend/package.json ./packages/frontend/
37- COPY packages/types/package.json ./packages/types/
35+ FROM base AS production
3836
3937# Install production dependencies
4038# RUN pnpm install --shamefully-hoist --frozen-lockfile --prod=true
@@ -48,7 +46,6 @@ COPY --from=build /app/packages/backend/src/database/migrations ./packages/backe
4846
4947# Copy the entrypoint script and make it executable
5048COPY docker/docker-entrypoint.sh /usr/local/bin/
51- RUN chmod +x /usr/local/bin/docker-entrypoint.sh
5249
5350# Expose the port the app runs on
5451EXPOSE 4000
0 commit comments