diff --git a/.dockerignore b/.dockerignore index 3325280d..80da067e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,10 @@ node_modules npm-debug.log -images \ No newline at end of file +images +.git +.github +coverage +packages/**/coverage +packages/frontend +packages/jobs +**/*.log \ No newline at end of file diff --git a/packages/backend/Dockerfile b/packages/backend/Dockerfile index c624fb26..0373ca45 100644 --- a/packages/backend/Dockerfile +++ b/packages/backend/Dockerfile @@ -2,37 +2,31 @@ FROM node:20-alpine AS build WORKDIR /usr/src/app -# Copy root package files for workspaces +# Copy workspace and backend files required for compilation and minification. COPY package.json package-lock.json ./ COPY tsconfig.base.json ./ +COPY packages/backend/package.json ./packages/backend/ +COPY packages/backend/tsconfig.json ./packages/backend/ +COPY packages/backend/tsconfig.prod.json ./packages/backend/ +COPY packages/backend/src ./packages/backend/src + +# Build and minify backend artifact inside Docker. +RUN npm ci \ + && npm run build:prod -w @mocker/backend \ + && npm run minify -w @mocker/backend \ + && npx esbuild /usr/src/app/packages/backend/dist/index.js --bundle --minify --platform=node --target=node20 --format=cjs --outfile=/usr/src/app/packages/backend/dist/runtime.cjs \ + && mkdir -p /usr/src/app/images + +FROM gcr.io/distroless/nodejs20-debian12:nonroot AS release +ENV NODE_ENV=production \ + PORT=80 -# Copy backend package -COPY packages/backend/package.json packages/backend/ -COPY packages/backend/tsconfig.json packages/backend/ -COPY packages/backend/tsconfig.prod.json packages/backend/ -COPY packages/backend/src packages/backend/src - -# Install dependencies and build -RUN npm ci -RUN npm run build:prod -w @mocker/backend - -FROM node:20-alpine AS release -ENV NODE_ENV=production PORT=80 WORKDIR /usr/src/app -# Copy built output -COPY --from=build /usr/src/app/packages/backend/dist ./ - -# Copy package files for production install -COPY --from=build /usr/src/app/package.json ./ -COPY --from=build /usr/src/app/package-lock.json ./ -COPY --from=build /usr/src/app/packages/backend/package.json ./packages/backend/ - -RUN mkdir -p /usr/src/app/images - -# Install production dependencies only for the backend workspace -RUN npm pkg delete scripts.prepare && npm ci --omit=dev -w @mocker/backend --ignore-scripts +# Copy bundled runtime artifact and writable path from build stage. +COPY --from=build --chown=65532:65532 /usr/src/app/packages/backend/dist/runtime.cjs ./runtime.cjs +COPY --from=build --chown=65532:65532 /usr/src/app/images ./images EXPOSE 80 -CMD ["node", "/usr/src/app/index.js"] +CMD ["/usr/src/app/runtime.cjs"]