Dockerfile 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. # ========================================
  2. # 第一阶段:构建前端资源
  3. # ========================================
  4. FROM node:20-alpine AS frontend-builder
  5. # 设置工作目录
  6. WORKDIR /app
  7. # 安装 bun
  8. RUN npm install -g bun@latest
  9. # 复制 package.json 并配置 npm 镜像
  10. COPY package.json ./
  11. RUN npm config set registry https://registry.npmmirror.com
  12. # 安装依赖并生成 lockfile
  13. RUN bun install
  14. # 复制其他配置文件
  15. COPY tailwind.config.js postcss.config.js vite.config.js ./
  16. # 复制源码
  17. COPY resources/ ./resources/
  18. # 构建前端资源
  19. RUN bun run build
  20. # ========================================
  21. # 第二阶段:PHP 运行时
  22. # ========================================
  23. FROM php:8.3-alpine AS runtime
  24. # 安装系统依赖 - 使用阿里云镜像
  25. RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
  26. apk add --no-cache \
  27. git \
  28. curl \
  29. ca-certificates \
  30. libzip-dev \
  31. libpng-dev \
  32. oniguruma-dev \
  33. libjpeg-turbo-dev \
  34. freetype-dev \
  35. icu-dev \
  36. libzip-dev \
  37. sqlite-dev \
  38. # Chrome/Chromium 依赖(PDF 生成必须)
  39. chromium \
  40. nss \
  41. freetype \
  42. harfbuzz \
  43. # 字体(PDF 中文显示必须)
  44. ttf-freefont \
  45. font-noto-cjk \
  46. font-noto \
  47. ttf-dejavu \
  48. fontconfig \
  49. # PDF 合并工具
  50. poppler-utils \
  51. && rm -rf /var/cache/apk/* \
  52. && fc-cache -fv
  53. # 设置 Chrome 环境变量
  54. ENV CHROME_BIN=/usr/bin/chromium-browser \
  55. CHROME_PATH=/usr/lib/chromium/ \
  56. PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \
  57. PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser
  58. # 安装 PHP 扩展
  59. RUN docker-php-ext-configure gd --with-freetype --with-jpeg && \
  60. docker-php-ext-install -j$(nproc) pdo pdo_mysql pdo_sqlite gd zip intl pcntl
  61. # 安装 Redis 扩展
  62. RUN apk add --no-cache --virtual .build-deps $PHPIZE_DEPS \
  63. && pecl install redis \
  64. && docker-php-ext-enable redis \
  65. && apk del .build-deps
  66. # 安装 Composer - 使用国内镜像
  67. COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
  68. RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
  69. # 创建应用目录
  70. WORKDIR /app
  71. # 复制 Composer 文件并安装依赖
  72. COPY composer.json composer.lock ./
  73. RUN composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader --no-scripts
  74. # 复制应用代码(排除 node_modules, vendor 等)
  75. COPY . .
  76. # 从第一阶段复制构建好的前端资源
  77. COPY --from=frontend-builder /app/public/build ./public/build
  78. # 缓存路由和视图(不缓存配置,配置在运行时从 .env 读取)
  79. RUN php artisan route:cache && \
  80. php artisan view:cache && \
  81. php artisan filament:upgrade || true
  82. # 创建必要目录
  83. RUN mkdir -p storage/logs storage/framework/cache storage/framework/sessions storage/framework/views bootstrap/cache
  84. # 设置权限
  85. RUN chown -R www-data:www-data /app && \
  86. chmod -R 755 /app && \
  87. chmod -R 777 /app/storage /app/bootstrap/cache
  88. EXPOSE 8000
  89. # 健康检查
  90. HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  91. CMD php artisan --version || exit 1
  92. CMD ["php", "artisan", "serve", "--host=0.0.0.0", "--port=8000"]