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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 09:44:57