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"]
|