From 6b4c519d14b4e72cc06f91c385b972d2bc6d23b1 Mon Sep 17 00:00:00 2001 From: Noe Terrier Date: Mon, 9 Mar 2026 12:20:07 +0100 Subject: [PATCH 1/3] feat: use multistage build --- Dockerfile | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 9d9c62b..799b561 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,21 +1,39 @@ -FROM node:18-alpine - -RUN apk update +# Stage 1: install dependencies +FROM node:18-alpine AS deps +WORKDIR /app +COPY package*.json . ARG NODE_ENV=production ENV NODE_ENV=${NODE_ENV} -ENV DIRECTUS_URL=https://clic.epfl.ch/directus -ENV NEXT_PUBLIC_DIRECTUS_URL=https://clic.epfl.ch/directus +RUN npm config set fetch-retry-maxtimeout 600000 -g && npm ci + +# Stage 2: build +FROM node:18-alpine AS builder WORKDIR /app -COPY package.json package-lock.json ./ -RUN npm config set fetch-retry-maxtimeout 600000 -g && npm ci +COPY --from=deps /app/node_modules ./node_modules +COPY src ./src +COPY public ./public COPY . . + +ENV DIRECTUS_URL=https://clic.epfl.ch/directus +ENV NEXT_PUBLIC_DIRECTUS_URL=https://clic.epfl.ch/directus + +RUN apk update RUN npm run build +# Stage 3: run +FROM node:18-alpine +WORKDIR /app + # switch to unprivileged user from node base image RUN chown -R node . USER node +COPY --from=builder /app/.next ./.next +COPY --from=builder /app/public ./public +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/package.json ./ + CMD [ "npm", "start" ] From 5c4e65dd7aaea55cdd42b17e631205cf650625fb Mon Sep 17 00:00:00 2001 From: Noe Terrier Date: Mon, 9 Mar 2026 12:31:02 +0100 Subject: [PATCH 2/3] feat: update node image version --- Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 799b561..8aa04ce 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Stage 1: install dependencies -FROM node:18-alpine AS deps +FROM node:25-alpine AS deps WORKDIR /app COPY package*.json . ARG NODE_ENV=production @@ -9,7 +9,7 @@ RUN npm config set fetch-retry-maxtimeout 600000 -g && npm ci # Stage 2: build -FROM node:18-alpine AS builder +FROM node:25-alpine AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules @@ -24,7 +24,7 @@ RUN apk update RUN npm run build # Stage 3: run -FROM node:18-alpine +FROM node:25-alpine WORKDIR /app # switch to unprivileged user from node base image From f2e2d9daf3d5d3f1ff7c58677d14512f4e39009b Mon Sep 17 00:00:00 2001 From: Noe Terrier Date: Mon, 9 Mar 2026 12:32:39 +0100 Subject: [PATCH 3/3] feat: clean dockerfile --- Dockerfile | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/Dockerfile b/Dockerfile index 8aa04ce..fa2def1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,36 +4,25 @@ WORKDIR /app COPY package*.json . ARG NODE_ENV=production ENV NODE_ENV=${NODE_ENV} - RUN npm config set fetch-retry-maxtimeout 600000 -g && npm ci - # Stage 2: build FROM node:25-alpine AS builder WORKDIR /app - COPY --from=deps /app/node_modules ./node_modules -COPY src ./src -COPY public ./public COPY . . - ENV DIRECTUS_URL=https://clic.epfl.ch/directus ENV NEXT_PUBLIC_DIRECTUS_URL=https://clic.epfl.ch/directus - -RUN apk update -RUN npm run build +RUN apk update && npm run build # Stage 3: run FROM node:25-alpine WORKDIR /app - # switch to unprivileged user from node base image RUN chown -R node . USER node - COPY --from=builder /app/.next ./.next COPY --from=builder /app/public ./public COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/package.json ./ - CMD [ "npm", "start" ]