Laravel应用Docker部署优化:如何缩减超2GB镜像体积?
优化Laravel Docker镜像体积的关键步骤
你的Dockerfile生成镜像体积超2GB,核心问题在于构建依赖与运行环境未分离、镜像层冗余、未清理临时文件,以下是针对性优化方案:
一、强制使用多阶段构建(核心优化)
将依赖安装、代码构建(composer/yarn)与运行环境完全分离,构建阶段的工具(composer、nodejs、yarn)不会进入最终镜像,这是缩减体积最有效的手段。
二、合并RUN命令,减少镜像层
Docker每个RUN指令会生成新的镜像层,合并重复操作可大幅减少冗余体积。比如把所有apk add命令合并为一次执行,避免多次分层。
三、彻底清理临时文件与缓存
- apk安装后清理
/var/cache/apk/* - composer安装后清理
~/.composer/cache - yarn构建完成后删除
node_modules(仅保留编译后的前端静态资源) - 删除构建过程中生成的临时文件(如composer安装脚本)
四、精简依赖,移除冗余内容
- 移除重复安装的PHP扩展(你的配置里
php82-tokenizer重复安装了两次) - 仅保留Laravel运行必需的扩展,非核心功能依赖可按需移除
- 避免在镜像中执行本地可完成的操作(如
php artisan vendor:publish可提前在本地处理,或通过.env控制在容器启动时执行) - 不要设置过度宽松的权限(如
777),仅给storage、bootstrap/cache等必要目录设置权限即可
优化后的Dockerfile示例
# 构建阶段:处理依赖安装、前端编译等构建操作 FROM alpine:latest AS builder WORKDIR /var/www/html # 安装构建必需的依赖 RUN apk add --no-cache php82 php82-phar php82-zip php82-mbstring php82-iconv \ curl nodejs yarn tzdata && \ ln -s /usr/bin/php82 /usr/bin/php && \ rm -rf /var/cache/apk/* # 安装composer RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # 先复制依赖配置文件,利用Docker缓存加速构建 COPY composer.json composer.lock ./ RUN composer install --no-dev --optimize-autoloader && \ rm -rf ~/.composer/cache COPY package.json yarn.lock ./ RUN yarn install && yarn build && \ rm -rf node_modules # 复制完整项目文件 COPY . . RUN cp .env.example .env && \ php artisan key:generate --ansi && \ chmod -R 755 storage bootstrap/cache # 运行阶段:仅保留运行必需的环境与文件 FROM alpine:latest AS runner WORKDIR /var/www/html ENV TZ=Asia/Jakarta # 安装运行必需的依赖 RUN apk add --no-cache php82 php82-fpm php82-pdo php82-opcache php82-gd php82-curl \ php82-openssl php82-mbstring php82-exif php82-tokenizer php82-fileinfo php82-json \ php82-xml php82-pdo_mysql php82-pecl-redis nginx supervisor tzdata bash && \ ln -s /usr/bin/php82 /usr/bin/php && \ sed -i 's/bin\/ash/bin\/bash/g' /etc/passwd && \ rm -rf /var/cache/apk/* # 创建必要目录 RUN mkdir -p /run/php /run/nginx /etc/supervisor.d # 从构建阶段复制编译好的项目文件 COPY --from=builder /var/www/html /var/www/html # 复制服务配置文件 COPY ./docker/supervisor/supervisord.ini /etc/supervisor.d/supervisord.ini COPY ./docker/php/php-fpm.conf /etc/php82/php-fpm.conf COPY ./docker/php/php.ini-production /etc/php82/php.ini COPY ./docker/nginx/nginx.conf /etc/nginx/ COPY ./docker/nginx/webserver.conf /etc/nginx/http.d/default.conf # 配置日志与进程文件 RUN touch /run/php/php8.2-fpm.pid /run/nginx/nginx.pid /var/www/html/storage/logs/worker.log && \ ln -sf /dev/stdout /var/log/nginx/access.log && \ ln -sf /dev/stderr /var/log/nginx/error.log # 配置定时任务 ADD ./docker/cron/crontab.txt /crontab.txt RUN /usr/bin/crontab /crontab.txt # 设置必要目录权限 RUN chown -R nginx:nginx /var/www/html/storage /var/www/html/bootstrap/cache /var/lib/nginx && \ chmod -R 755 /var/www/html/storage /var/www/html/bootstrap/cache /var/lib/nginx /var/log/nginx EXPOSE 80 CMD ["/usr/bin/supervisord"]
额外优化建议
- 使用
composer install --no-dev移除开发依赖 - Laravel的
config:cache和route:cache可在构建阶段执行,减少容器启动时间 - 通过
.dockerignore配置,避免复制.git、tests、README.md等非必需目录到镜像中
内容的提问来源于stack exchange,提问作者Rosyid Ma'ruf
相关产品推荐
相关产品推荐

