在 docker 中为 php 安装 gd 扩展时,若重复执行 `docker-php-ext-install gd` 且未携带配置参数,会导致第二次安装覆盖前次正确配置,从而丢失 jpeg(及 freetype)支持。本文详解根本原因、验证方法与可靠修复方案。
问题核心在于:GD 扩展的安装是幂等但不可叠加的。docker-php-ext-configure 仅设置构建时的 config.m4 参数,而 docker-php-ext-install gd 才真正编译并启用扩展。一旦先执行了带 --with-jpeg 的 configure + install,又再次执行不带参数的 docker-php-ext-install gd,后者会跳过 configure 步骤(因 config.nice 已存在),直接使用默认(即禁用 JPEG)参数重新编译,最终覆盖掉此前正确的 GD 模块。
从你提供的 .gitlab-ci.yml 可清晰看到问题所在:
- sh scripts/gd-install.sh # ✅ 第一次:正确 configure + install(含 --with-jpeg) - docker-php-ext-install bcmath - docker-php-ext-install sockets - docker-php-ext-install gd # ❌ 第二次:无 configure,无 --with-jpeg → 覆盖安装!
该冗余命令直接导致 gd_info() 中 JPEG Support 为空。
彻底移除重复安装语句
删除 .gitlab-ci.yml 中这一行:
- docker-php-ext-install gd
仅保留 scripts/gd-install.sh 的调用——它已完整完成配置与安装。
强化 gd-install.sh 的健壮性(推荐)
添加模块存在性检查,避免重复操作,并显式验证依赖库路径:
#!/bin/bash
[[ ! -e /.dockerenv ]] && exit 0
# 确保系统级 JPEG 库已安装(关键!)
apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \ # 注意:PHP 7.4 推荐此包,非 libjpeg-dev
libpng-dev \
libwebp-dev \
&& rm -rf /var/lib/apt/lists/*
# 显式指定库路径(防自动探测失败)
docker-php-ext-configure gd \
--with-freetype=/usr/include/freetype2 \
--with-jpeg=/usr \
--with-webp \
--with-png
# 编译安装
docker-php-ext-install -j$(nproc) gd验证安装结果(CI 中建议加入断言)
在 php -r 'print_r(gd_info());' 后添加校验逻辑,确保关键功能启用:
php -r "
\$info = gd_info();
if (!\$info['JPEG Support']) {
echo \"❌ ERROR: JPEG support is missing in GD extension\\n\";
exit(1);
}
if (!\$info['FreeType Support']) {
echo \"❌ ERROR: FreeType support is missing\\n\";
exit(1);
}
echo \"✅ GD extension OK: JPEG & FreeType enabled\\n\";
"通过精简流程、显式路径配置与自动化校验,即可在 CI 环境中稳定获得具备完整 JPEG、PNG、WebP 和 FreeType 支持的 GD 扩展,彻底规避“No JPEG support in this PHP build”错误。