refactor(docker): use shared base images for @bytelyst/* packages

Update Dockerfiles to use bytelyst-common-base-backend and bytelyst-common-base-web
images instead of installing @bytelyst/* packages via tarballs.

Benefits:
- Smaller final images (~50MB vs ~250MB)
- Faster builds (base image cached)
- Consistent package versions across products
- No need for docker-prep.sh tarball packing

Generated with [Devin](https://cli.devin.ai/docs)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
root 2026-05-09 23:22:59 +00:00
parent 28807d4889
commit cb51cbe671
2 changed files with 64 additions and 41 deletions

View File

@ -1,35 +1,45 @@
FROM node:22-alpine AS builder # ── Stage 1: Build ───────────────────────────────────────────────────────
FROM bytelyst-common-base-backend:latest AS builder
WORKDIR /app/backend WORKDIR /app/backend
ARG GITEA_NPM_HOST # Copy backend package files
ENV NODE_TLS_REJECT_UNAUTHORIZED=0
ENV NPM_CONFIG_STRICT_SSL=false
ENV GITEA_NPM_HOST=$GITEA_NPM_HOST
RUN npm config set strict-ssl false \
&& npm install -g pnpm@10.6.5
COPY .npmrc.docker ./.npmrc
COPY .docker-deps/ /app/.docker-deps/
COPY backend/package.json ./package.json COPY backend/package.json ./package.json
RUN --mount=type=secret,id=gitea_npm_token \
export GITEA_NPM_TOKEN="$(cat /run/secrets/gitea_npm_token 2>/dev/null || echo '')" && \
pnpm install --ignore-scripts --lockfile=false
COPY backend/tsconfig.json ./tsconfig.json COPY backend/tsconfig.json ./tsconfig.json
# Install backend-specific dependencies only
RUN pnpm install --prod --ignore-scripts
# Copy source code
COPY backend/src/ ./src/ COPY backend/src/ ./src/
COPY shared/ ../shared/ COPY shared/ ../shared/
# Build backend
RUN pnpm run build RUN pnpm run build
FROM node:22-alpine # ── Stage 2: Production ───────────────────────────────────────────────────
FROM bytelyst-common-base-backend:latest
WORKDIR /app/backend WORKDIR /app/backend
# Copy backend package files
COPY backend/package.json ./package.json
# Install backend-specific dependencies
RUN pnpm install --prod --ignore-scripts
# Copy built artifacts from builder
COPY --from=builder /app/backend/dist ./dist
COPY --from=builder /app/backend/node_modules ./node_modules
COPY shared/ ../shared/
# Environment
ENV NODE_ENV=production ENV NODE_ENV=production
ENV NODE_TLS_REJECT_UNAUTHORIZED=0 ENV NODE_TLS_REJECT_UNAUTHORIZED=0
COPY --from=builder /app/backend/node_modules ./node_modules # Health check
COPY --from=builder /app/backend/package.json ./package.json HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
COPY --from=builder /app/backend/dist ./dist CMD node -e "require('http').get('http://localhost:4011/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"
COPY shared/ ../shared/
EXPOSE 4011 EXPOSE 4011
CMD ["node", "dist/server.js"] CMD ["node", "dist/server.js"]

View File

@ -1,43 +1,56 @@
FROM node:22-alpine AS builder # ── Stage 1: Build ───────────────────────────────────────────────────────
FROM bytelyst-common-base-web:latest AS builder
WORKDIR /app/web WORKDIR /app/web
ARG GITEA_NPM_HOST # Copy web package files
ENV NODE_TLS_REJECT_UNAUTHORIZED=0
ENV NPM_CONFIG_STRICT_SSL=false
ENV GITEA_NPM_HOST=$GITEA_NPM_HOST
RUN npm config set strict-ssl false \
&& npm install -g pnpm@10.6.5
COPY .npmrc.docker ./.npmrc
COPY .docker-deps/ /app/.docker-deps/
COPY web/package.json ./package.json COPY web/package.json ./package.json
RUN --mount=type=secret,id=gitea_npm_token \
export GITEA_NPM_TOKEN="$(cat /run/secrets/gitea_npm_token 2>/dev/null || echo '')" && \
pnpm install --ignore-scripts --lockfile=false
COPY web/next.config.ts ./next.config.ts COPY web/next.config.ts ./next.config.ts
COPY web/tsconfig.json ./tsconfig.json COPY web/tsconfig.json ./tsconfig.json
COPY web/next-env.d.ts ./next-env.d.ts COPY web/next-env.d.ts ./next-env.d.ts
# Install web-specific dependencies only
RUN pnpm install --prod --ignore-scripts
# Copy source code
COPY web/src/ ./src/ COPY web/src/ ./src/
COPY shared/ ../shared/ COPY shared/ ../shared/
# Build arguments
ARG NEXT_PUBLIC_BACKEND_URL ARG NEXT_PUBLIC_BACKEND_URL
ARG NEXT_PUBLIC_PLATFORM_SERVICE_URL ARG NEXT_PUBLIC_PLATFORM_SERVICE_URL
ENV NEXT_PUBLIC_BACKEND_URL=$NEXT_PUBLIC_BACKEND_URL ENV NEXT_PUBLIC_BACKEND_URL=$NEXT_PUBLIC_BACKEND_URL
ENV NEXT_PUBLIC_PLATFORM_SERVICE_URL=$NEXT_PUBLIC_PLATFORM_SERVICE_URL ENV NEXT_PUBLIC_PLATFORM_SERVICE_URL=$NEXT_PUBLIC_PLATFORM_SERVICE_URL
ENV NEXT_TELEMETRY_DISABLED=1 ENV NEXT_TELEMETRY_DISABLED=1
# Build web
RUN pnpm run build RUN pnpm run build
FROM node:22-alpine # ── Stage 2: Production ───────────────────────────────────────────────────
WORKDIR /app/web FROM bytelyst-common-base-web:latest
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
ENV NODE_TLS_REJECT_UNAUTHORIZED=0
WORKDIR /app/web
# Copy web package files
COPY web/package.json ./package.json
# Install web-specific dependencies (production only)
RUN pnpm install --prod --ignore-scripts
# Copy built artifacts from builder
COPY --from=builder /app/web/.next/standalone ./ COPY --from=builder /app/web/.next/standalone ./
COPY --from=builder /app/web/.next/static ./.next/static COPY --from=builder /app/web/.next/static ./.next/static
EXPOSE 3030 # Environment
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
ENV NODE_TLS_REJECT_UNAUTHORIZED=0
ENV PORT=3030 ENV PORT=3030
ENV HOSTNAME="0.0.0.0"
# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
CMD node -e "require('http').get('http://localhost:3030', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"
EXPOSE 3030
CMD ["node", "server.js"] CMD ["node", "server.js"]