From 525908d0e152ddb75eead2ab5392285ba28c5d4f Mon Sep 17 00:00:00 2001 From: Cory Darby Date: Fri, 21 Mar 2025 19:11:47 -0400 Subject: [PATCH] Optimise dockerfile & docker-compose --- Dockerfile | 42 +++++++++++++++++++++++++++++++++++++----- docker-compose.yml | 5 ++++- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 271f045..61e8f1b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,45 @@ -FROM node:18-alpine +# syntax=docker/dockerfile:1 -WORKDIR /usr/src/app +ARG NODE_VERSION=18 +ARG NODE_ENV=development +# --- Base Stage --- +FROM node:${NODE_VERSION}-alpine as base +WORKDIR /usr/src/app +# Install common dependencies (e.g. PostgreSQL client) RUN apk add --no-cache postgresql-client +EXPOSE 3005 -COPY package*.json ./ -RUN npm install +# --- Dependencies Stage --- +FROM base as deps +# Copy package files first to leverage caching +COPY package.json package-lock.json ./ +# Use cache mount for npm downloads; conditionally install based on NODE_ENV +RUN --mount=type=cache,target=/root/.npm \ + if [ "$NODE_ENV" = "production" ]; then \ + npm ci --omit=dev; \ + else \ + npm ci --include=dev; \ + fi + +# --- Builder Stage --- +FROM deps as builder +# Copy the rest of the application code COPY . . +# Generate Prisma client (or other build steps) RUN npx prisma generate -EXPOSE 3005 \ No newline at end of file +# --- Development Final Stage --- +FROM base as dev + +COPY --from=builder /usr/src/app ./ + +CMD ["npm", "run", "dev"] + +# --- Production Final Stage --- +FROM base as production + +COPY --from=builder /usr/src/app ./ + +CMD ["node", "index.js"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index b67d5ca..4659686 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,7 +12,10 @@ services: - postgres_data:/var/lib/postgresql/data/ jamcore: - build: . + build: + context: . + dockerfile: Dockerfile + target: ${NODE_ENV:-dev} environment: DATABASE_URL: "postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}" ports: