FROM node:22-alpine AS build WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . # Brand is baked at build (Vite VITE_* are build-time). Written here, not # via a context .env (.dockerignore excludes .env*). public/brand-logo.svg # ships the Fabric-purple Hangman Lab mark; override args if rebranding. ARG VITE_APP_NAME=Fabric ARG VITE_LOGO_URL=/brand-logo.svg ARG VITE_FAVICON_URL=/brand-logo.svg RUN printf 'VITE_APP_NAME=%s\nVITE_LOGO_URL=%s\nVITE_FAVICON_URL=%s\n' \ "$VITE_APP_NAME" "$VITE_LOGO_URL" "$VITE_FAVICON_URL" > .env.production RUN npm run build FROM nginx:1.27-alpine AS runtime COPY docker/nginx.conf /etc/nginx/conf.d/default.conf COPY docker/entrypoint.sh /docker-entrypoint-fabric.sh COPY --from=build /app/dist /usr/share/nginx/html RUN chmod +x /docker-entrypoint-fabric.sh # Runtime SPA config (see docker/entrypoint.sh). Override at `docker run` # / compose: empty values keep prior behavior. ENV FABRIC_OIDC_ONLY="" ENV FIX_TO_CENTER="" EXPOSE 80 ENTRYPOINT ["/docker-entrypoint-fabric.sh"] CMD ["nginx", "-g", "daemon off;"]