You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何构建轻量Laravel Docker镜像(ReactJS+Laravel前后端分离场景)

如何将Laravel镜像体积控制在100MB级(单Dockerfile多阶段构建方案)

你的React镜像之所以小巧,核心是用了多阶段构建——把依赖安装、项目编译的过程和最终运行环境完全分离,只保留生产必需的产物。Laravel同样可以这么做,而且完全能用单Dockerfile实现,不用额外配置文件或docker-compose。

问题根源分析

你当前的Laravel Dockerfile有两个核心问题导致体积过大:

  1. 用了webdevops/php-nginx:8.0(基于Debian)作为基础镜像,本身体积就很大;
  2. 没有分离构建和运行阶段,把编译依赖(比如git、libicu-dev这类编译工具)和整个项目文件都打包进了最终镜像。

优化后的单Dockerfile方案

这个方案用Alpine Linux作为基础(比Debian小80%以上),通过多阶段构建剥离所有不必要的内容:

# -------------------------- 第一阶段:构建阶段 --------------------------
FROM php:8.0-alpine AS builder

# 复制官方Composer(比curl安装更可靠)
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# 安装Laravel依赖和扩展所需的编译工具(仅在构建阶段存在)
RUN apk add --no-cache \
    git zip unzip \
    libpng-dev libxml2-dev oniguruma-dev icu-dev \
    g++ make autoconf

# 编译安装Laravel必需的PHP扩展
RUN docker-php-ext-install \
    intl pdo_mysql zip bcmath mbstring exif pcntl gd

# 设置工作目录
WORKDIR /app

# 先复制composer配置文件,利用Docker缓存层(依赖不变时无需重新安装)
COPY composer.json composer.lock ./
RUN composer install --no-interaction --optimize-autoloader --no-dev

# 复制整个项目代码
COPY . .

# 执行Laravel生产环境优化(生成缓存文件)
RUN php artisan config:cache
RUN php artisan route:cache
RUN php artisan view:cache # 若使用Blade模板,开启后进一步提升性能

# 清理构建阶段无用文件(大幅减小后续复制的体积)
RUN rm -rf .git tests README.md vendor/**/docs vendor/**/tests

# -------------------------- 第二阶段:运行阶段 --------------------------
FROM webdevops/php-nginx:8.0-alpine

# 设置Laravel运行环境变量
ENV WEB_DOCUMENT_ROOT /app/public
ENV APP_ENV production

# 仅安装Laravel运行必需的系统依赖(无编译工具)
RUN apk add --no-cache libpng libxml2 oniguruma icu

WORKDIR /app

# 从构建阶段仅复制生产必需的文件
COPY --from=builder /app/vendor ./vendor
COPY --from=builder /app/public ./public
COPY --from=builder /app/app ./app
COPY --from=builder /app/bootstrap ./bootstrap
COPY --from=builder /app/config ./config
COPY --from=builder /app/artisan ./artisan
COPY .env.production ./.env # 替换为你的生产环境配置文件

# 设置Laravel必需的可写目录权限
RUN chown -R application:application /app/storage /app/bootstrap/cache

EXPOSE 80
CMD ["supervisord", "-c", "/etc/supervisor/supervisord.conf"]

关键优化点说明

  1. Alpine基础镜像:Alpine是轻量级Linux发行版,基础镜像仅5MB左右,大幅压缩最终体积;
  2. 多阶段构建:编译工具、源码临时文件都留在builder阶段,最终镜像只保留运行必需的文件;
  3. 缓存层利用:先复制composer.json/composer.lock,只有依赖变更时才会重新执行composer install,加快构建速度;
  4. 无用文件清理:删除.git、测试目录、第三方依赖的文档/测试文件,进一步减小体积;
  5. 仅复制必需文件:不复制整个项目目录,只保留Laravel运行必须的核心目录和文件。

额外体积压缩技巧(可选)

如果想进一步逼近100MB,可以尝试:

  • 替换webdevops/php-nginx:8.0-alpine为纯nginx:alpine + php:8.0-fpm-alpine,自己编写极简Nginx配置(需要额外添加Nginx配置文件,但体积会更小);
  • 移除不需要的PHP扩展(比如如果不用gd,可以删掉相关安装命令);
  • 使用composer install --no-dev --classmap-authoritative替代--optimize-autoloader,生成更高效的自动加载文件。

验证效果

构建完成后,你会发现镜像体积能降到200MB以内,如果用纯Nginx+PHP-FPM的组合,甚至能压到150MB左右,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Dhenyson Jhean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 15:27:27