# Production image for Gallery (Express API + built Vite SPA). # Build from repository root: # docker build -f infra/docker/Dockerfile -t gitea.mysuperlab.netcraze.pro/danilka/gallery-web:latest . FROM node:20-alpine AS deps WORKDIR /app COPY package.json package-lock.json ./ COPY client/package.json client/package-lock.json ./client/ RUN npm ci --omit=dev WORKDIR /app/client RUN npm ci FROM node:20-alpine AS builder WORKDIR /app COPY package.json package-lock.json ./ COPY client/package.json client/package-lock.json ./client/ COPY --from=deps /app/node_modules ./node_modules COPY --from=deps /app/client/node_modules ./client/node_modules COPY server ./server COPY scripts ./scripts COPY db ./db COPY client ./client RUN npm run build --prefix client FROM node:20-alpine AS runner ARG APP_VERSION=0.0.0 ARG GIT_SHA= ARG IMAGE_TAG=latest ARG BUILD_TIME= ENV NODE_ENV=production ENV PORT=5173 ENV HOST=0.0.0.0 ENV IMAGE_DIR=/app/data/images ENV APP_VERSION=$APP_VERSION ENV GIT_SHA=$GIT_SHA ENV IMAGE_TAG=$IMAGE_TAG ENV BUILD_TIME=$BUILD_TIME RUN addgroup --system --gid 1001 nodejs \ && adduser --system --uid 1001 --ingroup nodejs gallery WORKDIR /app COPY package.json package-lock.json ./ COPY --from=deps /app/node_modules ./node_modules COPY server ./server COPY scripts ./scripts COPY db ./db COPY --from=builder /app/client/dist ./client/dist RUN mkdir -p /app/data/images && chown -R gallery:nodejs /app USER gallery EXPOSE 5173 CMD ["node", "server/index.js"]