conductor/Dockerfile.production
Victor Wiebe ade2b10033
Some checks failed
Release production image / production-image (push) Has been cancelled
Add production packaging and operations
2026-08-07 16:48:40 -04:00

46 lines
1.9 KiB
Docker

# syntax=docker/dockerfile:1.7
FROM node:20-alpine AS frontend-build
WORKDIR /build/frontend
COPY frontend/package*.json ./
RUN npm ci
COPY frontend/ ./
RUN npm run build
FROM node:20-alpine AS backend-build
RUN apk add --no-cache python3 make g++
WORKDIR /build/backend
COPY backend/package*.json ./
RUN npm ci
COPY backend/ ./
RUN npm run build && npm prune --omit=dev
FROM node:20-alpine AS runtime
ARG VERSION=development
ARG REVISION=unknown
ARG CREATED=unknown
LABEL org.opencontainers.image.title="Conductor" \
org.opencontainers.image.description="Visual builder for REST-backed web applications" \
org.opencontainers.image.version="${VERSION}" \
org.opencontainers.image.revision="${REVISION}" \
org.opencontainers.image.created="${CREATED}" \
org.opencontainers.image.source="https://gitea.skeletonworks.online/vwiebe/conductor"
ENV NODE_ENV=production \
PORT=8080 \
CONDUCTOR_DATA_DIR=/data \
CONDUCTOR_STATIC_DIR=/app/public \
CONDUCTOR_VERSION=${VERSION}
RUN addgroup -S -g 10001 conductor && adduser -S -D -H -u 10001 -G conductor conductor \
&& mkdir -p /app /data /shared/schemas \
&& chown -R conductor:conductor /app /data
WORKDIR /app
COPY --from=backend-build --chown=conductor:conductor /build/backend/package*.json ./
COPY --from=backend-build --chown=conductor:conductor /build/backend/node_modules ./node_modules
COPY --from=backend-build --chown=conductor:conductor /build/backend/dist ./dist
COPY --from=frontend-build --chown=conductor:conductor /build/frontend/build ./public
COPY --chown=conductor:conductor shared/schemas/conductor-project.schema.json /shared/schemas/conductor-project.schema.json
USER conductor
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \
CMD node -e "fetch('http://127.0.0.1:8080/api/health').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))"
CMD ["node", "dist/index.js"]