139 lines
3.9 KiB
Docker
139 lines
3.9 KiB
Docker
# 多阶段构建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 \
|
||
# LibreOffice用于生成高保真PDF预览,Noto CJK用于中文字体渲染
|
||
libreoffice \
|
||
font-noto-cjk \
|
||
ttf-dejavu \
|
||
# 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"]
|