# 多阶段构建Dockerfile - Laravel知识库系统 (Swoole版本) # 确保构建为linux/amd64架构 # ================================ # 基础阶段 - 安装系统依赖 # ================================ FROM php:8.2-cli-alpine AS base # 设置工作目录 WORKDIR /var/www/html # 安装系统依赖 RUN apk add --no-cache \ # 基础工具 curl \ git \ unzip \ zip \ # PHP扩展依赖 libpng-dev \ libjpeg-turbo-dev \ freetype-dev \ libzip-dev \ icu-dev \ oniguruma-dev \ # Pandoc文档转换工具 pandoc \ # Node.js和npm (使用较小的版本) nodejs \ npm \ # 进程管理 supervisor # 配置和安装PHP扩展 RUN docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) \ pdo_mysql \ mysqli \ zip \ gd \ intl \ mbstring \ opcache \ bcmath \ exif \ pcntl # 安装Redis和Swoole扩展 RUN apk add --no-cache --virtual .build-deps $PHPIZE_DEPS linux-headers \ && pecl install redis-6.0.2 swoole-5.1.1 \ && docker-php-ext-enable redis swoole \ && apk del .build-deps # 安装Composer COPY --from=composer:latest /usr/bin/composer /usr/bin/composer # ================================ # 构建阶段 - 安装依赖和构建资源 # ================================ FROM base AS builder # 复制composer文件 COPY composer.json composer.lock ./ # 复制源代码(需要artisan文件) COPY . . # 安装PHP依赖(生产环境) RUN composer install --no-dev --optimize-autoloader --no-interaction --no-progress # 复制package.json文件 COPY package.json package-lock.json ./ # 安装NPM依赖(包括开发依赖用于构建) RUN npm ci # 构建前端资源 RUN npm run build # 设置Laravel缓存和优化 RUN php artisan config:cache \ && php artisan route:cache \ && php artisan view:cache # ================================ # 生产阶段 - 最终镜像 # ================================ FROM base AS production # 确保www-data用户存在(Alpine中可能已存在) RUN if ! getent group www-data > /dev/null 2>&1; then \ addgroup -g 82 -S www-data; \ fi \ && if ! getent passwd www-data > /dev/null 2>&1; then \ adduser -u 82 -D -S -G www-data www-data; \ fi # 复制PHP配置(仅保留基础PHP配置,移除PHP-FPM配置) COPY docker/php/php.ini /usr/local/etc/php/php.ini # 复制Supervisor配置(更新为Swoole版本) COPY docker/supervisor/supervisord.conf /etc/supervisor/conf.d/supervisord.conf # 复制健康检查脚本 COPY docker/queue-health-check.sh /usr/local/bin/queue-health-check.sh COPY docker/swoole-health-check.sh /usr/local/bin/swoole-health-check.sh RUN chmod +x /usr/local/bin/queue-health-check.sh \ && chmod +x /usr/local/bin/swoole-health-check.sh # 从构建阶段复制应用文件 COPY --from=builder --chown=www-data:www-data /var/www/html /var/www/html # 创建必要的目录并设置权限 RUN mkdir -p /var/www/html/storage/logs \ && mkdir -p /var/www/html/storage/framework/cache \ && mkdir -p /var/www/html/storage/framework/sessions \ && mkdir -p /var/www/html/storage/framework/views \ && mkdir -p /var/www/html/bootstrap/cache \ && mkdir -p /var/log/supervisor \ && mkdir -p /var/log \ && chown -R www-data:www-data /var/www/html/storage \ && chown -R www-data:www-data /var/www/html/bootstrap/cache \ && chmod -R 775 /var/www/html/storage \ && chmod -R 775 /var/www/html/bootstrap/cache # 暴露Swoole端口 EXPOSE 8000 # 健康检查 - 使用Swoole健康检查脚本 HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD /usr/local/bin/swoole-health-check.sh || exit 1 # 使用supervisor启动多个服务 CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]