feat(docker): 重构Monorepo构建 — 支持@genex/common共享包

- docker-compose.yml build context从service目录改为backend根目录
- 所有NestJS Dockerfile改为先构建共享@genex/common包
- 共享包编译后复制到service的node_modules供运行时解析
- 新增backend/.dockerignore减少构建上下文体积

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-02-19 19:00:27 -08:00
parent d146bf0a1f
commit d48bd3acb9
11 changed files with 228 additions and 64 deletions

21
backend/.dockerignore Normal file
View File

@ -0,0 +1,21 @@
# Node
**/node_modules
**/dist
**/.env
# Infrastructure (not needed for service builds)
migrations/
seeds/
kong/
# Scripts
deploy.sh
**/deploy.sh
# Git
.git
.gitignore
# Go service build artifacts
**/tmp
**/*.exe

View File

@ -203,8 +203,8 @@ services:
user-service:
build:
context: ./services/user-service
dockerfile: Dockerfile
context: .
dockerfile: services/user-service/Dockerfile
container_name: genex-user-service
ports:
- "3001:3001"
@ -235,8 +235,8 @@ services:
issuer-service:
build:
context: ./services/issuer-service
dockerfile: Dockerfile
context: .
dockerfile: services/issuer-service/Dockerfile
container_name: genex-issuer-service
ports:
- "3002:3002"
@ -264,8 +264,8 @@ services:
clearing-service:
build:
context: ./services/clearing-service
dockerfile: Dockerfile
context: .
dockerfile: services/clearing-service/Dockerfile
container_name: genex-clearing-service
ports:
- "3004:3004"
@ -289,8 +289,8 @@ services:
compliance-service:
build:
context: ./services/compliance-service
dockerfile: Dockerfile
context: .
dockerfile: services/compliance-service/Dockerfile
container_name: genex-compliance-service
ports:
- "3005:3005"
@ -314,8 +314,8 @@ services:
notification-service:
build:
context: ./services/notification-service
dockerfile: Dockerfile
context: .
dockerfile: services/notification-service/Dockerfile
container_name: genex-notification-service
ports:
- "3008:3008"
@ -342,8 +342,8 @@ services:
telemetry-service:
build:
context: ./services/telemetry-service
dockerfile: Dockerfile
context: .
dockerfile: services/telemetry-service/Dockerfile
container_name: genex-telemetry-service
ports:
- "3011:3011"
@ -376,8 +376,8 @@ services:
admin-service:
build:
context: ./services/admin-service
dockerfile: Dockerfile
context: .
dockerfile: services/admin-service/Dockerfile
container_name: genex-admin-service
ports:
- "3012:3012"
@ -484,8 +484,8 @@ services:
auth-service:
build:
context: ./services/auth-service
dockerfile: Dockerfile
context: .
dockerfile: services/auth-service/Dockerfile
container_name: genex-auth-service
ports:
- "3010:3010"
@ -521,8 +521,8 @@ services:
ai-service:
build:
context: ./services/ai-service
dockerfile: Dockerfile
context: .
dockerfile: services/ai-service/Dockerfile
container_name: genex-ai-service
ports:
- "3006:3006"

View File

@ -1,16 +1,32 @@
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
# Build shared @genex/common package
COPY packages/common/package*.json ./packages/common/
RUN cd packages/common && npm install
COPY packages/common/ ./packages/common/
RUN cd packages/common && npm run build
# Install service dependencies
COPY services/admin-service/package*.json ./services/admin-service/
WORKDIR /app/services/admin-service
RUN npm install
COPY . .
# Copy common package into node_modules for runtime resolution
RUN mkdir -p node_modules/@genex/common && \
cp -r /app/packages/common/dist node_modules/@genex/common/ && \
cp /app/packages/common/package.json node_modules/@genex/common/
# Copy service source and build
COPY services/admin-service/ ./
RUN npm run build
FROM node:20-alpine
WORKDIR /app
RUN apk add --no-cache dumb-init
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
COPY --from=builder /app/services/admin-service/dist ./dist
COPY --from=builder /app/services/admin-service/node_modules ./node_modules
COPY --from=builder /app/services/admin-service/package.json ./
USER node
EXPOSE 3012
CMD ["dumb-init", "node", "dist/main"]

View File

@ -1,16 +1,32 @@
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
# Build shared @genex/common package
COPY packages/common/package*.json ./packages/common/
RUN cd packages/common && npm install
COPY packages/common/ ./packages/common/
RUN cd packages/common && npm run build
# Install service dependencies
COPY services/ai-service/package*.json ./services/ai-service/
WORKDIR /app/services/ai-service
RUN npm install
COPY . .
# Copy common package into node_modules for runtime resolution
RUN mkdir -p node_modules/@genex/common && \
cp -r /app/packages/common/dist node_modules/@genex/common/ && \
cp /app/packages/common/package.json node_modules/@genex/common/
# Copy service source and build
COPY services/ai-service/ ./
RUN npm run build
FROM node:20-alpine
WORKDIR /app
RUN apk add --no-cache dumb-init
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
COPY --from=builder /app/services/ai-service/dist ./dist
COPY --from=builder /app/services/ai-service/node_modules ./node_modules
COPY --from=builder /app/services/ai-service/package.json ./
USER node
EXPOSE 3006
CMD ["dumb-init", "node", "dist/main"]

View File

@ -1,16 +1,32 @@
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
# Build shared @genex/common package
COPY packages/common/package*.json ./packages/common/
RUN cd packages/common && npm install
COPY packages/common/ ./packages/common/
RUN cd packages/common && npm run build
# Install service dependencies
COPY services/auth-service/package*.json ./services/auth-service/
WORKDIR /app/services/auth-service
RUN npm install
COPY . .
# Copy common package into node_modules for runtime resolution
RUN mkdir -p node_modules/@genex/common && \
cp -r /app/packages/common/dist node_modules/@genex/common/ && \
cp /app/packages/common/package.json node_modules/@genex/common/
# Copy service source and build
COPY services/auth-service/ ./
RUN npm run build
FROM node:20-alpine
WORKDIR /app
RUN apk add --no-cache dumb-init
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
COPY --from=builder /app/services/auth-service/dist ./dist
COPY --from=builder /app/services/auth-service/node_modules ./node_modules
COPY --from=builder /app/services/auth-service/package.json ./
USER node
EXPOSE 3010
CMD ["dumb-init", "node", "dist/main"]

View File

@ -1,16 +1,32 @@
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
# Build shared @genex/common package
COPY packages/common/package*.json ./packages/common/
RUN cd packages/common && npm install
COPY packages/common/ ./packages/common/
RUN cd packages/common && npm run build
# Install service dependencies
COPY services/clearing-service/package*.json ./services/clearing-service/
WORKDIR /app/services/clearing-service
RUN npm install
COPY . .
# Copy common package into node_modules for runtime resolution
RUN mkdir -p node_modules/@genex/common && \
cp -r /app/packages/common/dist node_modules/@genex/common/ && \
cp /app/packages/common/package.json node_modules/@genex/common/
# Copy service source and build
COPY services/clearing-service/ ./
RUN npm run build
FROM node:20-alpine
WORKDIR /app
RUN apk add --no-cache dumb-init
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
COPY --from=builder /app/services/clearing-service/dist ./dist
COPY --from=builder /app/services/clearing-service/node_modules ./node_modules
COPY --from=builder /app/services/clearing-service/package.json ./
USER node
EXPOSE 3004
CMD ["dumb-init", "node", "dist/main"]

View File

@ -1,16 +1,32 @@
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
# Build shared @genex/common package
COPY packages/common/package*.json ./packages/common/
RUN cd packages/common && npm install
COPY packages/common/ ./packages/common/
RUN cd packages/common && npm run build
# Install service dependencies
COPY services/compliance-service/package*.json ./services/compliance-service/
WORKDIR /app/services/compliance-service
RUN npm install
COPY . .
# Copy common package into node_modules for runtime resolution
RUN mkdir -p node_modules/@genex/common && \
cp -r /app/packages/common/dist node_modules/@genex/common/ && \
cp /app/packages/common/package.json node_modules/@genex/common/
# Copy service source and build
COPY services/compliance-service/ ./
RUN npm run build
FROM node:20-alpine
WORKDIR /app
RUN apk add --no-cache dumb-init
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
COPY --from=builder /app/services/compliance-service/dist ./dist
COPY --from=builder /app/services/compliance-service/node_modules ./node_modules
COPY --from=builder /app/services/compliance-service/package.json ./
USER node
EXPOSE 3005
CMD ["dumb-init", "node", "dist/main"]

View File

@ -1,16 +1,32 @@
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
# Build shared @genex/common package
COPY packages/common/package*.json ./packages/common/
RUN cd packages/common && npm install
COPY packages/common/ ./packages/common/
RUN cd packages/common && npm run build
# Install service dependencies
COPY services/issuer-service/package*.json ./services/issuer-service/
WORKDIR /app/services/issuer-service
RUN npm install
COPY . .
# Copy common package into node_modules for runtime resolution
RUN mkdir -p node_modules/@genex/common && \
cp -r /app/packages/common/dist node_modules/@genex/common/ && \
cp /app/packages/common/package.json node_modules/@genex/common/
# Copy service source and build
COPY services/issuer-service/ ./
RUN npm run build
FROM node:20-alpine
WORKDIR /app
RUN apk add --no-cache dumb-init
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
COPY --from=builder /app/services/issuer-service/dist ./dist
COPY --from=builder /app/services/issuer-service/node_modules ./node_modules
COPY --from=builder /app/services/issuer-service/package.json ./
USER node
EXPOSE 3002
CMD ["dumb-init", "node", "dist/main"]

View File

@ -1,16 +1,32 @@
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
# Build shared @genex/common package
COPY packages/common/package*.json ./packages/common/
RUN cd packages/common && npm install
COPY packages/common/ ./packages/common/
RUN cd packages/common && npm run build
# Install service dependencies
COPY services/notification-service/package*.json ./services/notification-service/
WORKDIR /app/services/notification-service
RUN npm install
COPY . .
# Copy common package into node_modules for runtime resolution
RUN mkdir -p node_modules/@genex/common && \
cp -r /app/packages/common/dist node_modules/@genex/common/ && \
cp /app/packages/common/package.json node_modules/@genex/common/
# Copy service source and build
COPY services/notification-service/ ./
RUN npm run build
FROM node:20-alpine
WORKDIR /app
RUN apk add --no-cache dumb-init
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
COPY --from=builder /app/services/notification-service/dist ./dist
COPY --from=builder /app/services/notification-service/node_modules ./node_modules
COPY --from=builder /app/services/notification-service/package.json ./
USER node
EXPOSE 3008
CMD ["dumb-init", "node", "dist/main"]

View File

@ -1,16 +1,32 @@
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
# Build shared @genex/common package
COPY packages/common/package*.json ./packages/common/
RUN cd packages/common && npm install
COPY packages/common/ ./packages/common/
RUN cd packages/common && npm run build
# Install service dependencies
COPY services/telemetry-service/package*.json ./services/telemetry-service/
WORKDIR /app/services/telemetry-service
RUN npm install
COPY . .
# Copy common package into node_modules for runtime resolution
RUN mkdir -p node_modules/@genex/common && \
cp -r /app/packages/common/dist node_modules/@genex/common/ && \
cp /app/packages/common/package.json node_modules/@genex/common/
# Copy service source and build
COPY services/telemetry-service/ ./
RUN npm run build
FROM node:20-alpine
WORKDIR /app
RUN apk add --no-cache dumb-init
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
COPY --from=builder /app/services/telemetry-service/dist ./dist
COPY --from=builder /app/services/telemetry-service/node_modules ./node_modules
COPY --from=builder /app/services/telemetry-service/package.json ./
USER node
EXPOSE 3011
CMD ["dumb-init", "node", "dist/main"]

View File

@ -1,17 +1,32 @@
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
# Build shared @genex/common package
COPY packages/common/package*.json ./packages/common/
RUN cd packages/common && npm install
COPY packages/common/ ./packages/common/
RUN cd packages/common && npm run build
# Install service dependencies
COPY services/user-service/package*.json ./services/user-service/
WORKDIR /app/services/user-service
RUN npm install
COPY . .
# Copy common package into node_modules for runtime resolution
RUN mkdir -p node_modules/@genex/common && \
cp -r /app/packages/common/dist node_modules/@genex/common/ && \
cp /app/packages/common/package.json node_modules/@genex/common/
# Copy service source and build
COPY services/user-service/ ./
RUN npm run build
FROM node:20-alpine
WORKDIR /app
RUN apk add --no-cache dumb-init
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
COPY --from=builder /app/services/user-service/dist ./dist
COPY --from=builder /app/services/user-service/node_modules ./node_modules
COPY --from=builder /app/services/user-service/package.json ./
USER node
EXPOSE 3001
# Graceful shutdown: dumb-init forwards signals properly
CMD ["dumb-init", "node", "dist/main"]