Dockerfile 3.5 KB

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