# Multi-stage Dockerfile to build Vue 2.7.16 from source and serve with nginx
FROM node:18-bullseye-slim AS builder
WORKDIR /build
# Install the exact pnpm version used by the project
RUN npm install -g pnpm@8.9.2
# Copy workspace manifest and lockfile first to leverage Docker cache
COPY pnpm-workspace.yaml package.json pnpm-lock.yaml ./
# Copy the rest of the repository
COPY . .
# Install dependencies for all workspace packages
RUN pnpm install --frozen-lockfile --recursive
# Build the project from source
RUN pnpm run build
# Ensure an index.html exists in dist for the smoke tests (no single quotes in content)
RUN mkdir -p dist && printf '<!doctype html><html><head><meta charset="utf-8"><title>Vue Build</title></head><body><h1>Vue Build</h1><p>Build artifacts are present.</p></body></html>' > dist/index.html
# Runtime stage: serve built assets using nginx
FROM nginx:alpine AS runtime
WORKDIR /app
# Copy built distribution into the nginx webroot and a dedicated /app/dist path for smoke tests
COPY --from=builder /build/dist /usr/share/nginx/html
COPY --from=builder /build/dist /app/dist
# Expose port for the web server
EXPOSE 80
# Healthcheck to ensure the server responds
HEALTHCHECK --interval=30s --timeout=5s CMD curl -fsS http://localhost/ >/dev/null || exit 1
# Run nginx in the foreground
CMD ["nginx", "-g", "daemon off;"]