Dockerfile 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. # Stage 1: Build the TypeScript application
  2. FROM node:20-alpine AS build
  3. WORKDIR /usr/src/app
  4. # Copy package.json and package-lock.json first to leverage Docker cache
  5. COPY package.json package-lock.json ./
  6. RUN npm install
  7. # Copy the rest of the application source code
  8. COPY . .
  9. # Removed: RUN mkdir -p public/app - No longer needed as public/app will be copied directly in Stage 2
  10. # Build TypeScript to JavaScript
  11. RUN npm run build
  12. # 全局安装 PM2 用于进程管理
  13. RUN npm install -g pm2
  14. # Stage 2: Run the application
  15. FROM node:20-alpine
  16. WORKDIR /usr/src/app
  17. # 复制构建阶段的 artifact
  18. COPY --from=build /usr/src/app/dist ./dist
  19. COPY --from=build /usr/src/app/node_modules ./node_modules
  20. COPY --from=build /usr/src/app/package.json ./package.json
  21. COPY --from=build /usr/src/app/ecosystem.config.js ./ecosystem.config.js
  22. COPY --from=build /usr/src/app/public ./public
  23. # 全局安装 PM2 用于进程管理
  24. RUN npm install -g pm2
  25. # 创建日志目录 (确保容器内路径存在且可写)
  26. RUN mkdir -p /app/logs/coloring
  27. # 设置日志目录权限 (例如,给 node 用户)
  28. # Node.js 官方 alpine 镜像通常以 'node' 用户运行,UID 通常为 1000
  29. RUN chown -R node:node /app/logs/coloring
  30. USER node # 以非 root 用户运行应用
  31. # 暴露应用程序监听的端口
  32. EXPOSE 3000
  33. EXPOSE 3001
  34. # 定义容器启动命令
  35. CMD ["pm2-runtime", "ecosystem.config.js"]