2
2
# Multi-stage build for client and server
3
3
4
4
# Stage 1: Dependencies base (shared)
5
- FROM node:20-alpine AS deps-base
5
+ FROM node:20-slim AS deps-base
6
6
WORKDIR /app
7
- COPY package.json package-lock.json ./
8
- COPY client/package*.json ./client/
9
- COPY server/package*.json ./server/
10
- RUN npm install --include=dev
11
- RUN cd client && npm install --include=dev
12
- RUN cd server && npm install --include=dev
7
+
8
+ # Clear npm cache and remove any existing lock files to avoid conflicts
9
+ RUN npm cache clean --force
10
+
11
+ COPY package.json ./
12
+ COPY client/package.json ./client/
13
+ COPY server/package.json ./server/
14
+
15
+ # Install dependencies with clean slate approach (no lock files)
16
+
17
+ RUN npm install --no-package-lock --include=dev
18
+ RUN cd client && npm install --no-package-lock --include=dev
19
+ RUN cd server && npm install --no-package-lock --include=dev
13
20
14
21
# Stage 2: Build client
15
22
FROM deps-base AS client-builder
@@ -26,10 +33,10 @@ COPY client/ ./client/
26
33
RUN cd server && npm run build
27
34
28
35
# Stage 4: Production image - extend existing or create new
29
- FROM node:20-alpine AS production
36
+ FROM node:20-slim AS production
30
37
31
38
# Install dumb-init for proper signal handling
32
- RUN apk add -- no-cache dumb-init
39
+ RUN apt-get update && apt-get install -y -- no-install-recommends dumb-init && rm -rf /var/lib/apt/lists/*
33
40
34
41
# Create app directory
35
42
WORKDIR /app
@@ -55,8 +62,8 @@ COPY shared/ ./shared/
55
62
COPY bin/ ./bin/
56
63
57
64
# Create non-root user
58
- RUN addgroup -g 1001 -S nodejs && \
59
- adduser -S mcpjam -u 1001
65
+ RUN groupadd --gid 1001 nodejs && \
66
+ useradd --uid 1001 --gid nodejs --shell /bin/bash --create-home mcpjam
60
67
61
68
# Change ownership of the app directory
62
69
RUN chown -R mcpjam:nodejs /app
0 commit comments