rwadurian/backend/services/mining-admin-service/Dockerfile

76 lines
1.8 KiB
Docker

# =============================================================================
# Mining Admin Service - Dockerfile
# =============================================================================
# 阶段1: 构建
FROM node:20-alpine AS builder
WORKDIR /app
# 复制依赖文件
COPY package*.json ./
COPY tsconfig*.json ./
# 复制 Prisma schema
COPY prisma ./prisma/
# 安装所有依赖
RUN npm ci
# 生成 Prisma Client
RUN DATABASE_URL="postgresql://user:pass@localhost:5432/db" npx prisma generate
# 复制源代码
COPY src ./src
# 构建应用
RUN npm run build
# 阶段2: 生产运行
FROM node:20-alpine AS runner
# 创建非 root 用户
RUN addgroup --system --gid 1001 nodejs && \
adduser --system --uid 1001 -G nodejs nestjs
# 安装运行时依赖
RUN apk add --no-cache curl tzdata
# 创建 app 目录并设置所有权
RUN mkdir -p /app && chown nestjs:nodejs /app
WORKDIR /app
# 切换到非 root 用户
USER nestjs
# 复制依赖文件并安装生产依赖
COPY --chown=nestjs:nodejs package*.json ./
RUN npm ci --only=production && npm cache clean --force
# 复制 Prisma schema 并生成 client
COPY --chown=nestjs:nodejs prisma ./prisma/
RUN DATABASE_URL="postgresql://user:pass@localhost:5432/db" npx prisma generate
# 复制构建产物
COPY --chown=nestjs:nodejs --from=builder /app/dist ./dist
# 创建启动脚本
RUN echo '#!/bin/sh\n\
set -e\n\
echo "Running database migrations..."\n\
npx prisma migrate deploy\n\
echo "Starting application..."\n\
exec node dist/main.js\n' > /app/start.sh && chmod +x /app/start.sh
ENV NODE_ENV=production
ENV TZ=Asia/Shanghai
# 暴露端口
EXPOSE 3023
# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=10s --retries=3 \
CMD curl -f http://localhost:3023/health || exit 1
# 启动应用
CMD ["/app/start.sh"]