Dockerfile 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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. # dbus(解决 Chrome 在容器中的连接问题)
  44. dbus \
  45. # 字体(PDF 中文显示必须)
  46. ttf-freefont \
  47. font-noto-cjk \
  48. font-noto \
  49. ttf-dejavu \
  50. fontconfig \
  51. # PDF 合并工具
  52. poppler-utils \
  53. # Node.js(KaTeX 服务端渲染需要)
  54. nodejs \
  55. npm \
  56. && rm -rf /var/cache/apk/* \
  57. && fc-cache -fv \
  58. && mkdir -p /run/dbus
  59. # 设置 Chrome 环境变量
  60. ENV CHROME_BIN=/usr/bin/chromium-browser \
  61. CHROME_PATH=/usr/lib/chromium/ \
  62. PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \
  63. PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser
  64. # 安装 PHP 扩展
  65. RUN docker-php-ext-configure gd --with-freetype --with-jpeg && \
  66. docker-php-ext-install -j$(nproc) pdo pdo_mysql pdo_sqlite gd zip intl pcntl
  67. # 安装 Redis 扩展
  68. RUN apk add --no-cache --virtual .build-deps $PHPIZE_DEPS \
  69. && pecl install redis \
  70. && docker-php-ext-enable redis \
  71. && apk del .build-deps
  72. # 安装 Composer - 使用国内镜像
  73. COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
  74. RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
  75. # 创建应用目录
  76. WORKDIR /app
  77. # 复制 Composer 文件并安装依赖
  78. COPY composer.json composer.lock ./
  79. RUN composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader --no-scripts
  80. # 复制应用代码(排除 node_modules, vendor 等)
  81. COPY . .
  82. # 从第一阶段复制构建好的前端资源
  83. COPY --from=frontend-builder /app/public/build ./public/build
  84. # 安装 KaTeX(服务端公式渲染)
  85. RUN npm config set registry https://registry.npmmirror.com && \
  86. npm install -g katex@0.16.9
  87. # 缓存路由和视图(不缓存配置,配置在运行时从 .env 读取)
  88. RUN php artisan route:cache && \
  89. php artisan view:cache && \
  90. php artisan filament:upgrade || true
  91. # 创建必要目录
  92. RUN mkdir -p storage/logs storage/framework/cache storage/framework/sessions storage/framework/views bootstrap/cache
  93. # 设置权限
  94. RUN chown -R www-data:www-data /app && \
  95. chmod -R 755 /app && \
  96. chmod -R 777 /app/storage /app/bootstrap/cache
  97. EXPOSE 8000
  98. # 健康检查
  99. HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  100. CMD php artisan --version || exit 1
  101. # 启动脚本:先启动 dbus,再运行主命令
  102. COPY docker-entrypoint.sh /usr/local/bin/
  103. RUN chmod +x /usr/local/bin/docker-entrypoint.sh
  104. ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
  105. CMD ["php", "artisan", "serve", "--host=0.0.0.0", "--port=8000"]