Dockerfile 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. # 多阶段构建 - 构建阶段
  2. FROM node:20-alpine AS builder
  3. # 安装构建依赖,包括bcrypt编译所需的工具
  4. RUN apk add --no-cache \
  5. python3 \
  6. make \
  7. g++ \
  8. cairo-dev \
  9. jpeg-dev \
  10. pango-dev \
  11. musl-dev \
  12. giflib-dev \
  13. pixman-dev \
  14. pangomm-dev \
  15. libjpeg-turbo-dev \
  16. freetype-dev
  17. WORKDIR /app
  18. # 复制package文件
  19. COPY package*.json ./
  20. COPY tsconfig*.json ./
  21. # 安装所有依赖(包括开发依赖,因为需要tsc进行构建)
  22. RUN npm ci && \
  23. npm cache clean --force
  24. # 复制源代码
  25. COPY src ./src
  26. # 构建应用
  27. RUN npm run build
  28. # 开发阶段
  29. FROM node:20-alpine AS development
  30. # 安装运行时依赖和构建工具
  31. RUN apk add --no-cache \
  32. python3 \
  33. make \
  34. g++ \
  35. cairo-dev \
  36. jpeg-dev \
  37. pango-dev \
  38. musl-dev \
  39. giflib-dev \
  40. pixman-dev \
  41. pangomm-dev \
  42. libjpeg-turbo-dev \
  43. freetype-dev
  44. WORKDIR /app
  45. COPY package*.json ./
  46. RUN npm install
  47. COPY . .
  48. EXPOSE 3000 9229
  49. CMD ["npm", "run", "dev"]
  50. # 生产阶段
  51. FROM node:20-alpine AS production
  52. # 安装运行时依赖
  53. RUN apk add --no-cache \
  54. python3 \
  55. make \
  56. g++ \
  57. cairo-dev \
  58. jpeg-dev \
  59. pango-dev \
  60. musl-dev \
  61. giflib-dev \
  62. pixman-dev \
  63. pangomm-dev \
  64. libjpeg-turbo-dev \
  65. freetype-dev
  66. WORKDIR /app
  67. # 创建非root用户
  68. RUN addgroup -g 1001 -S nodejs && \
  69. adduser -S nodejs -u 1001
  70. # 复制依赖
  71. COPY package*.json ./
  72. RUN npm ci --only=production && \
  73. npm cache clean --force
  74. # 从构建阶段复制构建产物
  75. COPY --from=builder --chown=nodejs:nodejs /app/dist ./dist
  76. COPY --from=builder --chown=nodejs:nodejs /app/node_modules ./node_modules
  77. # 切换到非root用户
  78. USER nodejs
  79. # 暴露端口
  80. EXPOSE 3000
  81. # 健康检查
  82. HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  83. CMD node dist/utils/healthcheck.js || exit 1
  84. # 启动应用
  85. CMD ["node", "dist/server.js"]