无法在PHP 8.1.5 Docker容器中启用gd的Freetype。

5
问题:Call to undefined function imagettfbboxfunction_exists('imagettfbbox')的输出为false
我现在已经看了很多Dockerfile,似乎开启gd的Freetype并不难。然而,尽管我的Dockerfile没有错误,但当我查看phpinfo时,Freetype并没有被启用...
我错过了什么吗?
GD Support          enabled
GD Version          bundled (2.1.0 compatible)
GIF Read Support    enabled
GIF Create Support  enabled
PNG Support         enabled
libPNG Version      1.6.37
WBMP Support        enabled
XBM Support         enabled
BMP Support         enabled
TGA Read Support    enabled

这是我的Dockerfile文件

FROM php:8.1.5-fpm-alpine3.15

ENV PHP_OPCACHE_VALIDATE_TIMESTAMPS="0" \
    PHP_OPCACHE_MAX_ACCELERATED_FILES="20000" \
    PHP_OPCACHE_MEMORY_CONSUMPTION="256" \
    PHP_OPCACHE_MAX_WASTED_PERCENTAGE="10"

RUN apk add bash curl zip libzip-dev libxpm libxpm-dev libpng libpng-dev libwebp libwebp-dev libjpeg-turbo libjpeg-turbo-dev freetype freetype-dev imagemagick imagemagick-dev && rm /var/cache/apk/*
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer

RUN docker-php-ext-install pdo_mysql

RUN apk add $PHPIZE_DEPS
RUN pecl install redis
RUN docker-php-ext-configure zip 
RUN docker-php-ext-configure gd --enable-gd --with-webp --with-jpeg --with-xpm --with-freetype 
RUN docker-php-ext-install zip opcache
RUN docker-php-ext-install gd 
RUN docker-php-ext-enable redis 

RUN apk del --purge autoconf g++ make

WORKDIR /var/www

COPY ./dockerfiles/php/php.ini /usr/local/etc/php/php.ini
COPY ./dockerfiles/php/php-fpm-pool.conf /usr/local/etc/php-fpm.d
COPY ./dockerfiles/php/opcache.ini /usr/local/etc/php/conf.d/opcache.ini

COPY ./app/ /var/www

RUN PATH=$PATH:/var/www/bin:bin

RUN composer install

CMD ["php-fpm", "-F"]

参考配置如下:

# php.ini

realpath_cache_size=1M
realpath_cache_ttl=300
upload_max_filesize=16M
date.timezone="Europe/Belgrade"
session.save_handler=redis
session.save_path="localhost:6379"

# php-fpm-pool.conf 

[www]
user = www-data
group = www-data

listen = 0.0.0.0:9000
listen.backlog = 1023

pm = dynamic
pm.max_children = 8
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.status_path = /php-fpm-status
ping.path = /php-fpm-ping
request_terminate_timeout = 5m
chdir = /
catch_workers_output = yes
clear_env = no

# opcache.ini 

[opcache]

opcache.enable=1
opcache.revalidate_freq=0
#opcache.validate_timestamps=${PHP_OPCACHE_VALIDATE_TIMESTAMPS}
opcache.max_accelerated_files=${PHP_OPCACHE_MAX_ACCELERATED_FILES}
opcache.memory_consumption=${PHP_OPCACHE_MEMORY_CONSUMPTION}
opcache.max_wasted_percentage=${PHP_OPCACHE_MAX_WASTED_PERCENTAGE}
opcache.interned_strings_buffer=16

opcache.fast_shutdown=1


我也尝试过使用 FROM php:8.0-fpm-alpineFROM php:7.4-fpm-alpine3.13,但是都没有成功。 - Jos
这个 Dockerfile 似乎工作正常,但镜像不是“alpine”。在 docker-php-ext-configure gd 上使用 --prefix=/usr 就可以解决问题。请查看配置输出中的 checking for FreeType 2... yes 行。谢谢。 - Alexey Burdin
你解决了吗?我现在也面临着同样的问题。 - TEOL
很遗憾,我已经在运行一个外部服务来创建图像,现在我正在使用它来实现这个目的。我将来会再次处理这个问题,但目前它并不是优先考虑的事情。如果你找到了解决方案,我们会很高兴在这里阅读它;-) - Jos
该手册这个问题提到了--with-freetype-dir(而不是--with-freetype)。我自己从未尝试过,所以我不知道这是否是问题,或者这是否是一个转移注意力的话题。 - apokryfos
2个回答

2
也许这样可以解决它:
RUN apk add --no-cache freetype-dev libjpeg-turbo-dev libpng-dev libzip-dev zlib-dev
RUN docker-php-ext-configure gd --enable-gd --with-freetype --with-jpeg
RUN docker-php-ext-install gd

0

我使用这个Dockerfile成功构建了支持Freetype的程序

FROM php:8.1-fpm

RUN apt-get update \
    && apt-get install -y zlib1g-dev libpq-dev git libicu-dev libxml2-dev libcurl4-openssl-dev \
    pkg-config libssl-dev libzip-dev zlib1g-dev \
    libfreetype6-dev libjpeg62-turbo-dev libpng-dev

RUN docker-php-ext-configure gd --enable-gd --prefix=/usr --with-jpeg --with-freetype \
    && docker-php-ext-install -j$(nproc) gd

RUN php -r 'var_dump(gd_info());'

自 PHP 7.4 开始,--dir 选项(如 --with-freetype-dir、--with-jpeg-dir 等)已被移除,因此应使用 --prefix=/usr

gd_info() 输出

  ["GD Version"]=>
  string(26) "bundled (2.1.0 compatible)"
  ["FreeType Support"]=>
  bool(true)
  ["FreeType Linkage"]=>
  string(13) "with freetype"
  ["GIF Read Support"]=>
  bool(true)
  ["GIF Create Support"]=>
  bool(true)
  ["JPEG Support"]=>
  bool(true)
  ["PNG Support"]=>
  bool(true)
  ["WBMP Support"]=>
  bool(true)
  ["XPM Support"]=>
  bool(false)
  ["XBM Support"]=>
  bool(true)
  ["WebP Support"]=>
  bool(false)
  ["BMP Support"]=>
  bool(true)
  ["AVIF Support"]=>
  bool(false)
  ["TGA Read Support"]=>
  bool(true)
  ["JIS-mapped Japanese Font Support"]=>
  bool(false)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接