本文目录导读:

- 使用 Alpine 基础镜像
- 多阶段构建
- 使用官方 PHP 镜像提供的脚本
- 精简镜像示例
- 使用 .dockerignore 减少构建上下文
- 使用 distroless 镜像(最极端优化)
- 使用 Composer 优化
- 最小化镜像的大小对比
- 实际测试命令
- 最佳实践提示
在 PHP 中最小化 Docker 镜像,主要有以下几种策略:
使用 Alpine 基础镜像
# 使用 Alpine 版本(最小化的 Linux) FROM php:8.2-fpm-alpine # 或者使用 CLI 版本 FROM php:8.2-cli-alpine
多阶段构建
# 第一阶段:安装依赖和编译
FROM php:8.2-alpine AS builder
# 安装编译依赖
RUN apk add --no-cache --virtual .build-deps \
$PHPIZE_DEPS \
libzip-dev \
&& docker-php-ext-install pdo pdo_mysql zip \
&& apk del .build-deps
# 第二阶段:生产环境
FROM php:8.2-alpine
# 只保留运行时的依赖
RUN apk add --no-cache \
libzip \
&& docker-php-ext-install pdo pdo_mysql
COPY --from=builder /usr/local/etc/php/conf.d/ /usr/local/etc/php/conf.d/
COPY --from=builder /usr/local/lib/php/extensions/ /usr/local/lib/php/extensions/
使用官方 PHP 镜像提供的脚本
FROM php:8.2-cli-alpine
# 使用官方脚本安装扩展,自动清理缓存
RUN docker-php-ext-install -j$(nproc) pdo_mysql \
&& apk del .build-deps \
&& rm -rf /var/cache/apk/* /tmp/*
精简镜像示例
# 最终精简版
FROM php:8.2-cli-alpine
# 设置工作目录
WORKDIR /app
# 安装必要的运行时依赖(保持最小)
RUN apk add --no-cache \
icu-libs \
libpq \
&& docker-php-ext-install \
pdo \
pdo_mysql \
opcache
# 复制生产代码
COPY --from=builder /app /app
# 使用非 root 用户运行
RUN addgroup -g 1000 -S php && adduser -u 1000 -S php -G php \
&& chown -R php:php /app
USER php
CMD ["php", "artisan", "serve", "--host=0.0.0.0"]
使用 .dockerignore 减少构建上下文
# .dockerignore 文件 .git node_modules vendor tests *.md docker/ scripts/ .env .phpunit.result.cache storage/logs/* !storage/logs/.gitkeep
使用 distroless 镜像(最极端优化)
# 使用 Google distroless 镜像(只有二进制和运行所需) FROM php:8.2-alpine AS builder # 构建阶段... FROM gcr.io/distroless/static-debian12 # 只复制 PHP 二进制和配置文件 COPY --from=builder /usr/local/bin/php /usr/local/bin/ COPY --from=builder /usr/local/etc/php/ /usr/local/etc/php/ COPY --from=builder /app /app ENTRYPOINT ["/usr/local/bin/php"] CMD ["-a"]
使用 Composer 优化
FROM composer:2 AS composer # 先复制 composer 文件 COPY composer.json composer.lock ./ # 只安装生产依赖,忽略开发依赖 RUN composer install --no-dev --optimize-autoloader --no-interaction --no-progress # 然后复制到最终镜像 COPY --from=composer /app/vendor/ /app/vendor/
最小化镜像的大小对比
# 不同基础镜像大小 php:latest ~200MB php:8.2-fpm-alpine ~80MB php:8.2-cli-alpine ~70MB distroless ~30MB
实际测试命令
# 查看镜像大小 docker images | grep php # 构建镜像 docker build -t my-php-app:latest . # 查看构建后的大小 docker images my-php-app
最佳实践提示
- 只安装必要的扩展 - 按需安装
- 使用 --no-cache - 避免缓存文件
- 清理临时文件 - 删除 apk 缓存等
- 合并 RUN 命令 - 减少层数
- 使用 .dockerignore - 减少构建上下文
- 多阶段构建 - 分离构建和生产环境
- 使用 Alpine - 如果兼容性允许
选择哪种方法取决于你的具体需求,最常用的组合是 Alpine + 多阶段构建 + Composer 优化。