Dockerfile 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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-cli-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. && rm -rf /var/cache/apk/*
  39. # 安装 PHP 扩展
  40. RUN docker-php-ext-configure gd --with-freetype --with-jpeg && \
  41. docker-php-ext-install -j$(nproc) pdo pdo_mysql pdo_sqlite gd zip intl
  42. # 安装 Composer - 使用国内镜像
  43. COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
  44. RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
  45. # 创建应用目录
  46. WORKDIR /app
  47. # 复制 Composer 文件并安装依赖
  48. COPY composer.json composer.lock ./
  49. RUN composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader --no-scripts
  50. # 复制应用代码(排除 node_modules, vendor 等)
  51. COPY . .
  52. # 从第一阶段复制构建好的前端资源
  53. COPY --from=frontend-builder /app/public/build ./public/build
  54. # 生成 Laravel 应用密钥和优化
  55. RUN php artisan key:generate --ansi --force && \
  56. php artisan config:cache && \
  57. php artisan route:cache && \
  58. php artisan view:cache && \
  59. php artisan filament:upgrade || true
  60. # 创建必要目录
  61. RUN mkdir -p storage/logs storage/framework/cache storage/framework/sessions storage/framework/views bootstrap/cache
  62. # 设置权限
  63. RUN chown -R www-data:www-data /app && \
  64. chmod -R 755 /app && \
  65. chmod -R 777 /app/storage /app/bootstrap/cache
  66. EXPOSE 8000
  67. # 健康检查
  68. HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  69. CMD php artisan --version || exit 1
  70. CMD ["php", "artisan", "serve", "--host=0.0.0.0", "--port=8000"]