diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..42d0197 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,36 @@ +# --- STAGE 1: Base build environment --- +FROM node:lts-alpine3.23 AS base +WORKDIR /app +COPY package.json package-lock.json ./ + +# Install dependencies +RUN npm ci --legacy-peer-deps +COPY . . + +# Install necessary dependencies for sharp used by next/image (for image optimization) +RUN apk add --no-cache libc6-compat + +# --- STAGE 2: Environments +# Development +FROM base AS development +ARG ENVIRONMENT=development +ENV NODE_ENV=$ENVIRONMENT +EXPOSE 3000 +CMD ["npm", "run", "dev"] + +# Production +FROM base AS build +ARG ENVIRONMENT=production +ENV NODE_ENV=$ENVIRONMENT +RUN npm run build + +#--- STAGE 3: Production runtime environment +FROM node:lts-alpine3.23 AS production +WORKDIR /app +COPY --from=build /app/.next ./.next +COPY --from=build /app/package.json ./package.json +COPY --from=build /app/package-lock.json ./package-lock.json +COPY --from=build /app/public ./public +COPY --from=build /app/node_modules ./node_modules +EXPOSE 3000 +CMD ["npm", "run", "start"] diff --git a/compose/docker-compose.yml b/compose/docker-compose.yml new file mode 100644 index 0000000..e940370 --- /dev/null +++ b/compose/docker-compose.yml @@ -0,0 +1,15 @@ +services: + gsh-website: + image: gsh-website:prod + container_name: gsh-website + build: + context: . + dockerfile: Dockerfile + restart: unless-stopped + ports: + - "4000:3000" + volumes: + - ./public/uploads:/app/public/uploads + command: "npm run start" # Runn in prod mode + networks: + - default