尝试在 Docker 官方镜像中添加 freetype 到 php-gd

Posted

技术标签:

【中文标题】尝试在 Docker 官方镜像中添加 freetype 到 php-gd【英文标题】:Trying to add freetype to php-gd in Docker official image 【发布时间】:2018-03-08 14:09:53 【问题描述】:

我正在尝试为 php GD 安装添加一些功能。我使用 Docker PHP“官方”版本作为基础 (php:7.1.15-fpm-jessie)。

我目前的生产环境使用的是 CentOS,它的 GD 模块支持 FreeType、JPEG 和 PNG,你可以在 phpinfo 输出中看到:

GD Support => enabled
GD headers Version => 2.2.5
GD library Version => 2.2.5
FreeType Support => enabled
FreeType Linkage => with freetype
FreeType Version => 2.4.11
GIF Read Support => enabled
GIF Create Support => enabled
JPEG Support => enabled
libJPEG Version => 6b
PNG Support => enabled
libPNG Version => 1.5.13
WBMP Support => enabled
XPM Support => enabled
libXpm Version => 30411
XBM Support => enabled
WebP Support => enabled

Directive => Local Value => Master Value
gd.jpeg_ignore_warning => 1 => 1

但是这个 Docker 镜像没有 FreeType 和 JPEG 支持,并且带有一个更旧版本的 GD(请参阅下面的 phpinfo):

GD Support => enabled
GD Version => bundled (2.1.0 compatible)
GIF Read Support => enabled
GIF Create Support => enabled
PNG Support => enabled
libPNG Version => 1.2.50
WBMP Support => enabled
XBM Support => enabled

Directive => Local Value => Master Value
gd.jpeg_ignore_warning => 1 => 1

我需要重新编译 PHP 还是只需要重新编译扩展?该图像使用 Debian Jessie。

版本(解决方案):

重新编译后,我在这篇文章中找到了最好的解决方案:

solved! Troubles with Docker + PHP7 + GD resulting in "Call to undefined function imagecreatefromjpeg()"

所以我简单地补充了一句:

RUN apt-get update && apt-get install libgd3 libgd-dev && rm -rf /var/lib/apt/lists/*
RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/
RUN docker-php-ext-install -j$(nproc) gd

之后我的 phpinfo 开始显示:

GD Support => enabled
GD Version => bundled (2.1.0 compatible)
FreeType Support => enabled
FreeType Linkage => with freetype
FreeType Version => 2.5.2
GIF Read Support => enabled
GIF Create Support => enabled
JPEG Support => enabled
libJPEG Version => 6b
PNG Support => enabled
libPNG Version => 1.2.50

【问题讨论】:

也许你可以创建一个 Dockerfile,从图像 php:7.1.15-fpm-jessie 开始,然后添加 RUN apt-get update RUN apt-get install php-gd 或类似的东西。它对我有用,但需要 php5 安装 已经做到了。但是图像附带的标准编译GD不支持JPEG,....所以我正在弄清楚我需要重建什么 @jawbonewalk,我将采取不同的方法。我没有尝试使用 FROM 7.1.15-fpm-jessie,而是修改 7.1.15-fpm-jessie Dockerfile 以使用 JPEG 重新编译 php。 github.com/docker-library/php/blob/… 【参考方案1】:

将此添加到您的 Dockerfile:

RUN apt-get update && apt-get install -y libpng-dev 
RUN apt-get install -y \
    libwebp-dev \
    libjpeg62-turbo-dev \
    libpng-dev libxpm-dev \
    libfreetype6-dev

RUN docker-php-ext-configure gd \
    --with-gd \
    --with-webp-dir \
    --with-jpeg-dir \
    --with-png-dir \
    --with-zlib-dir \
    --with-xpm-dir \
    --with-freetype-dir \
    --enable-gd-native-ttf

RUN docker-php-ext-install gd

它对我有用。

【讨论】:

看起来--enable-gd-native-ttf 选项现在不可用 只是想指出,不再需要--enabled-gd-native-ttf,因为根据php manual page on gd,它是“从 PHP 5.5.0 开始无效;从 PHP 7.2.0 开始删除。 " 这在我删除 --enable-gd-native-ttf 后有效。 对于那些通过 google 找到此页面的人,对于 PHP 7.4,一些选项已被删除,您应该使用:RUN docker-php-ext-configure gd --with-jpeg --with-freetype RUN docker-php-ext-install gd 虽然在php工作了很多年,但我很快就会告别这种语言【参考方案2】:

对于我使用 php7.3,如果对我有用,请删除 --enable-gd-native-ttf

RUN apt-get update && apt-get install -y libpng-dev 
RUN apt-get install -y \
    libwebp-dev \
    libjpeg62-turbo-dev \
    libpng-dev libxpm-dev \
    libfreetype6-dev

RUN docker-php-ext-configure gd \
    --with-gd \
    --with-webp-dir \
    --with-jpeg-dir \
    --with-png-dir \
    --with-zlib-dir \
    --with-xpm-dir \
    --with-freetype-dir

RUN docker-php-ext-install gd

【讨论】:

【参考方案3】:

在寻找了很多解决这个问题之后,我找到了这个设置并且工作完美

FROM php:7.2-fpm
RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev \
    && docker-php-ext-install -j$(nproc) iconv \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd

https://forums.docker.com/t/problems-installing-gd-on-php7-2-with-docker-docker-version-18-09-7-build-2d0083d/78400/2

【讨论】:

您好,谢谢。使用 7.2 我也能够编译。但当时已经修复了一些与7.2版本的代码不兼容问题。

以上是关于尝试在 Docker 官方镜像中添加 freetype 到 php-gd的主要内容,如果未能解决你的问题,请参考以下文章

Docker中配置国内镜像

docker配置国内官方镜像

Docker容器实战六:构建定制化镜像

使用Docker中国官方镜像的加速地址

Docker 镜像:基于 Ubuntu 的基础镜像中文问题解决

如何给Docker配置官方国内加速镜像