PHP 怎么最小化镜像

wen PHP项目 1

本文目录导读:

PHP 怎么最小化镜像

  1. 使用 Alpine 基础镜像
  2. 多阶段构建
  3. 使用官方 PHP 镜像提供的脚本
  4. 精简镜像示例
  5. 使用 .dockerignore 减少构建上下文
  6. 使用 distroless 镜像(最极端优化)
  7. 使用 Composer 优化
  8. 最小化镜像的大小对比
  9. 实际测试命令
  10. 最佳实践提示

在 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

最佳实践提示

  1. 只安装必要的扩展 - 按需安装
  2. 使用 --no-cache - 避免缓存文件
  3. 清理临时文件 - 删除 apk 缓存等
  4. 合并 RUN 命令 - 减少层数
  5. 使用 .dockerignore - 减少构建上下文
  6. 多阶段构建 - 分离构建和生产环境
  7. 使用 Alpine - 如果兼容性允许

选择哪种方法取决于你的具体需求,最常用的组合是 Alpine + 多阶段构建 + Composer 优化

抱歉,评论功能暂时关闭!