在使用 Docker
构建 PHP
镜像时,我们通常会选择一个官方的 PHP
镜像作为基础镜像,然后在其上安装我们需要的扩展和工具。
例如,我们可以使用以下命令来构建一个 PHP
镜像:
FROM php:8.4-fpm
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
libzip-dev \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd \
&& docker-php-ext-install zip \
&& rm -rf /var/lib/apt/lists/*
核心痛点分析
传统PHP镜像构建后存在大量冗余依赖,主要源于:
- 编译工具链残留在生产环境
- 临时依赖包未自动清除
优化 Dockerfile(Debian系)
FROM php:8.4-fpm
RUN set -xe; \
# 记录初始包状态
savedAptMark="$(apt-mark showmanual)"; \
# 安装编译依赖(排除文档文件)
apt-get update && apt-get install -y --no-install-recommends \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
libzip-dev; \
docker-php-ext-configure gd --with-freetype --with-jpeg; \
docker-php-ext-install -j$(nproc) gd zip; \
rm -rf /var/lib/apt/lists/*; \
# 智能清理机制
apt-mark auto '.*' > /dev/null; \
[ -z "$savedAptMark" ] || apt-mark manual $savedAptMark; \
# 动态库依赖分析
find /usr/local -type f -executable -exec ldd '{}' ';' \
| awk '/=>/ { so = $(NF-1); if (index(so, "/usr/local/") == 1) { next }; gsub("^/(usr/)?", "", so); printf "*%s\n", so }' \
| sort -u \
| xargs -r dpkg-query --search \
| cut -d: -f1 \
| sort -u \
| xargs -r apt-mark manual \
; \
# 深度清理
apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
rm -rf /var/lib/apt/lists/*
注意事项
- 动态库验证:清理后需测试php -m确认扩展加载正常
- 架构兼容性:x86_64架构依赖需与目标环境一致
- 安全更新:定期重建镜像获取安全补丁
评论1
Qi
推荐一下博主的 PHP docker镜像:https://github.com/iiQi/docker-php