如何缩小Laravel 7.4项目的Docker镜像体积?
Laravel 7.4 Docker镜像体积优化方案
一、使用多阶段构建(核心优化手段)
多阶段构建能彻底分离构建环境与运行环境,仅将运行必需的文件复制到最终镜像,这是缩小体积最有效的方法。以下是适配Laravel 7.4的优化Dockerfile示例:
# 阶段1:构建环境(用于安装依赖、编译代码) FROM php:7.4-fpm AS builder # 安装构建所需系统依赖与PHP扩展 RUN apt-get update && apt-get install -y \ git \ zip \ unzip \ libzip-dev \ libpng-dev \ libjpeg-dev \ libfreetype6-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install gd pdo_mysql zip opcache \ && apt-get clean && rm -rf /var/lib/apt/lists/* # 安装Composer COPY --from=composer:latest /usr/bin/composer /usr/bin/composer WORKDIR /var/www/html # 复制项目文件与Composer配置 COPY . . # 仅安装生产环境依赖,优化自动加载器 RUN composer install --no-dev --optimize-autoloader --no-interaction --no-progress \ && composer clear-cache # 阶段2:运行环境(轻量镜像,仅保留运行必需组件) FROM php:7.4-fpm-alpine # 安装运行时依赖(仅保留必要的系统库与PHP扩展) RUN apk add --no-cache \ libzip \ libpng \ libjpeg-turbo \ freetype \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install gd pdo_mysql zip opcache \ && rm -rf /var/cache/apk/* WORKDIR /var/www/html # 从构建阶段复制仅运行所需的文件 COPY --from=builder /var/www/html /var/www/html # 设置Laravel所需的文件权限 RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache EXPOSE 9000 CMD ["php-fpm"]
二、其他关键优化措施
移除冗余依赖与文件
- 构建依赖时使用
composer install --no-dev排除开发工具(如PHPUnit、Laravel Dusk) - 不要复制项目中的
.git、tests、node_modules(前端资源已编译完成时)等无关目录 - 每次安装系统依赖后立即清理缓存(如
apt-get clean、rm -rf /var/lib/apt/lists/*)
- 构建依赖时使用
使用轻量基础镜像
- 替换基于Debian的
php:7.4-fpm为php:7.4-fpm-alpine,Alpine镜像基于BusyBox,体积仅为前者的1/5左右 - 若需搭配Nginx,使用
nginx:alpine替代标准Nginx镜像
- 替换基于Debian的
合并命令减少镜像层
- 将多个
RUN指令合并为一个,减少镜像层数的同时避免缓存冗余,示例见上述Dockerfile中的依赖安装步骤
- 将多个
前端资源单独构建
- 若项目包含Vue/React等前端代码,新增前端构建阶段:
# 前端构建阶段 FROM node:16-alpine AS frontend-builder WORKDIR /var/www/html COPY package*.json ./ RUN npm install --production COPY . . RUN npm run prod - 再将编译后的
public目录复制到最终镜像中
- 若项目包含Vue/React等前端代码,新增前端构建阶段:
内容的提问来源于stack exchange,提问作者NamAvar
相关产品推荐
相关产品推荐

