如何构建轻量Laravel Docker镜像(ReactJS+Laravel前后端分离场景)
如何将Laravel镜像体积控制在100MB级(单Dockerfile多阶段构建方案)
你的React镜像之所以小巧,核心是用了多阶段构建——把依赖安装、项目编译的过程和最终运行环境完全分离,只保留生产必需的产物。Laravel同样可以这么做,而且完全能用单Dockerfile实现,不用额外配置文件或docker-compose。
问题根源分析
你当前的Laravel Dockerfile有两个核心问题导致体积过大:
- 用了
webdevops/php-nginx:8.0(基于Debian)作为基础镜像,本身体积就很大; - 没有分离构建和运行阶段,把编译依赖(比如
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"]
关键优化点说明
- Alpine基础镜像:Alpine是轻量级Linux发行版,基础镜像仅5MB左右,大幅压缩最终体积;
- 多阶段构建:编译工具、源码临时文件都留在
builder阶段,最终镜像只保留运行必需的文件; - 缓存层利用:先复制
composer.json/composer.lock,只有依赖变更时才会重新执行composer install,加快构建速度; - 无用文件清理:删除
.git、测试目录、第三方依赖的文档/测试文件,进一步减小体积; - 仅复制必需文件:不复制整个项目目录,只保留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
相关产品推荐
相关产品推荐

